Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

シリアルポート

現代の組み込みボードにおいて、ほぼ普遍的な I/O 標準に最も近いものが「シリアルポート」です。ほとんどすべてのマイクロコントローラーには、いくつかのピンをシリアルポートとして動作させる方法があり、またほとんどすべてのマイクロコントローラーボードではそれらのピンに簡単にアクセスできるようになっています。MB2 も例外ではありません。

この章では、まずシリアルポートとはそもそも何かを説明します。そのうえで、USB を使ってコンピューターに「仮想シリアルポート」を設定し、その仮想ポートを「ターミナルソフトウェア」とともに使って MB2 上のシリアルポートとやり取りする方法を示します。

では、このserial portとは何でしょうか。これは、2 つのデバイスが、各方向に 1 本ずつのデータ線(全二重で)と共通グラウンドを使い、データを 1 ビットずつ(直列に)やり取りする場所です。シリアルポートはもともと「RS-232」として始まりました。詳しくはこの章の後半にある歴史の節を参照してください。ただし、送信線と受信線で使われるプロトコルには、私の知る限り正式名称がありません。単に「serial」、あるいは「async serial」や「UART serial」と呼ばれる程度です。

はっきりさせておくと、現代のコンピューターにおける通信チャネルの大半はシリアルです。USB(「Universal Serial Bus」)はシリアルチャネルですし、I2C(これについては後で説明します)もシリアルチャネルです。この章と次章は、シリアル通信という一般概念についての話では ありません。これらの章で扱うのは、独自の実装と歴史を持つ「シリアルポート」と呼ばれる特定のものです。

シリアルポート通信は、共有されるどの線にもクロック信号が載っていないという意味で 非同期 です。その代わり、通信を行う 前に、双方がワイヤ上でデータをどれくらいの速さで送るかをおおよそ合意しておく必要があります。Universal Asynchronous Receiver/Transmitter(UART)と呼ばれる周辺回路は、指定された速度で出力線にビットを送信し、入力線上でビットの開始を監視します。

シリアルポート通信プロトコルはフレーム単位で動作し、各フレームは 1 バイトのデータを運びます。各フレームには 1 つの スタート ビット、5〜9 ビットのペイロードデータ(lsb から msb の順に送信されます。現代のアプリケーションで 9 ビットバイトを送ることはまれです。フレーム内のビット数が 7 以下の場合は、左側を 0 で埋めて 8 ビットバイトになります)、そして 1〜2 個の ストップビット があります。上の図では、ASCII の ‘E’ 文字が 8 データビットと 1 ストップビットを使って送信されています。

このプロトコルの速度は ボーレート と呼ばれ、1 秒あたりのビット数(bps)で表されます。(これが変だと思ったなら、そのとおりです。「Baud」は本来、1 秒あたりの シンボル数 を表すべきものです。1 つのシンボルは 1 つのフレームに対応すべきですし、仮に 1 データビットを「シンボル」と見なしたとしても、プロトコルの他の部分があるため、それらはこのレートでは送られません。これは慣習であって、理にかなっている必要はありません。)UART シリアルで歴史的によく使われてきたボーレートは 9600bps、19200bps、115200bps ですが、現代では 921,600bps でデータを送ることも珍しくありません。

「通常」の構成である、1 スタートビット、8 データビット、1 ストップビット、ビットレート 921.6K bps では、毎秒 92.16K バイトの送受信ができます。これは単一チャネルの非圧縮 CD オーディオを伝送するのに十分な速さです。今回使用する 115,200 bps のビットレートでは、毎秒 11.52K バイトの送受信ができます。これはほとんどの用途では十分です。

私たちは、MB2 とあなたのコンピューターの間でデータをやり取りするために(間接的に)シリアルポートを使います。ここでこう思うかもしれません。なぜ前と同じように RTT を使わないのでしょうか。RTT は、デバッグ専用に使うことを意図したプロトコルです。RTT を使って他のデバイスと通信するデバイスに出会うことはないでしょう。しかし、シリアル通信はかなり頻繁に使われます。たとえば、一部の GPS 受信機は、受信した位置情報をシリアル経由で送信します。さらに RTT は、多くのデバッグプロトコルと同様に、シリアルの転送速度と比べると低速です。

今日のコンピューターには通常シリアルポートがありませんし、仮にあったとしても、その電圧(現代のシリアルポートでは +5V、古い RS-232 ポートでは ±12V)は MB2 のハードウェアが受け入れられる範囲外であり、損傷の原因になるおそれがあります。コンピューターをマイクロコントローラーに直接接続することはできません。

しかし、ほとんどの現代的なマイクロコントローラーボードの +3.3V 入力に対応した、安価な(たいてい US$5 未満の)USB←→シリアル変換器を 購入できます。上に示したボードは、私が日常的によく使っている一般的なものです。私たちは MB2 に内蔵された USB ポートを通して MB2 のシリアルポートと通信します。しかし、MB2 であれ他のボードであれ、ハードウェアのシリアルポートに直接接続したい場合は、シリアル変換器を使うのがよい方法です。

MB2 の USB ポート上の別の USB チャネルを使って、MB2 内蔵の USB←→シリアル変換器と通信できます。(これは上図の右側の経路です。)この USB←→シリアル変換は、MB2 の「communications microcontroller」を使って実装されています。通信マイクロコントローラーは、マイクロコントローラーに対してはシリアルインターフェイスを、コンピューターに対しては仮想 USB シリアルインターフェイスを公開します。コンピューターは、USB CDC-ACM(「Communications Device Class - Abstract Control Model」――やれやれ)デバイスクラスを介して仮想シリアルインターフェイスを提供します。MB2 のマイクロコントローラーからは、あなたのコンピューターがそのハードウェアシリアルポートに接続されたデバイスとして見えます。あなたのコンピューターからは、MB2 のシリアルポートが仮想シリアルデバイスとして見えます。

それでは、OS が提供する USB シリアルポートインターフェイスに慣れていきましょう。次のいずれかを選んでください。

MacOS の場合は Linux のドキュメントを参照してください。ただし、多少勝手が異なる可能性があります。