組み込み
UART
post:
UART(ユーアート)は、2台の機器が送信用と受信用の信号線を使い、データを1ビットずつ順番に送り合うシリアル通信の回路と通信方式です。 マイコンやルーター、シングルボードコンピューターで、ほかの部品とのやり取りや、動作を確認するためのコンソール接続に使われます。
UARTとは?
UARTは「Universal Asynchronous Receiver/Transmitter」の略です。 本来はデータを送受信する回路を指しますが、その回路で行う通信方式や、接続端子を含めて「UART」と呼ぶこともよくあります。
名前にある「非同期(Asynchronous)」は、送る側と受け取る側でタイミングを合わせるためのクロック信号を共有しないという意味です。 代わりに、両方の機器が「1秒間に何ビット送るか」という速度を事前にそろえておき、それぞれが自分の時計で信号を読み取ります。 この速度をボーレートと呼びます(後の節で説明します)。
仕組みが単純で必要な信号線も少ないため、マイコンとGPSモジュールなどの部品との通信や、機器の起動ログを読むためのシリアルコンソールに広く使われています。
接続に使う信号線
UARTで双方向に通信する場合、基本的には次の3本を接続します。
- TX(送信):自分がデータを送り出す線
- RX(受信):相手からのデータを受け取る線
- GND(グラウンド):電圧の基準をそろえるための線
一方のTXが送った信号は、もう一方のRXで受け取ります。そのため、TXは相手のRXへ、RXは相手のTXへ交差させて接続します。 TX同士をつなぐと正常に通信できません。両方の出力が異なる電圧を出そうとすると、大きな電流が流れ、機器を傷めるおそれもあります。 また、信号の「High」「Low」は電圧で表すため、GNDをつないで両方の機器の基準をそろえる必要があります。 機器の起動ログを読むだけなら、機器のTXとアダプターのRX、およびGNDの接続だけで済む場合もあります。
USBシリアル変換アダプターには電源を出力するVCC端子が付いていることがありますが、ルーターなど自分の電源で動く機器とのコンソール接続では、通常VCCはつなぎません。 2つの電源を同時につなぐと、機器を壊すおそれがあります。
送信と受信に別々の線を使うため、UARTは両方向へ同時にデータを送れます(全二重通信)。 このほか、受信側が「今は受け取れない」と知らせるRTS・CTSなどの線を加え、送信を一時停止させる方式もあります(フロー制御)。コンソール接続では使わないことが多い線です。
データの送り方(フレーム)
UARTは、データを「フレーム」というまとまりで送ります。1フレームに含まれるデータは、8ビット設定なら1バイトです。 何も送っていない間、信号線はHighのまま待機しています。送信側は次の順にビットを送ります。
- スタートビット:信号を1ビット分Lowにして、これから送ることを知らせる
- データビット:データを1ビットずつ送る。8ビットが一般的で、多くは下位のビットから送る
- パリティビット(省略可):データと合わせた1の数が、設定した偶数または奇数になるように付ける。受信側で誤りの一部を見つけるために使う
- ストップビット:信号をHighにして、フレームの終わりを示す。一般的には1ビットまたは2ビット分
受信側は、待機中のHighからLowへ切り替わった瞬間をスタートビットとして検出し、そこからボーレートで決まる間隔で各ビットを読み取ります。 フレームごとにスタートビットでタイミングを取り直すため、クロック信号を共有しなくても通信できます。
この設定は「8N1」のように略して書かれます。データ8ビット、パリティなし(None)、ストップビット1個という意味で、シリアルコンソールでよく使われる組み合わせです。 パリティを偶数(Even)にする場合は「8E1」のように書きます。
ボーレート:通信の速度をそろえる
ボーレートは、1秒間に送る信号の単位(シンボル)の数で、単位はボー(baud)です。通常のUARTでは1シンボルで1ビットを表すため、1秒あたりのビット数(bps)と同じ数値になります。 同じ値のビットが続くときは、ビットごとに信号の電圧が切り替わるわけではありません。 9600、38400、115200などの値が一般的で、Raspberry PiやOpenWrtの多くの機器では115200bpsがシリアルコンソールに使われます。
送信側と受信側でボーレートが違うと、受信側は間違ったタイミングでビットを読むことになり、意味のない記号が並ぶ文字化けが起こります。 正しい値が分からない場合は、機器の資料を確認するか、よく使われる値を順に試します。
ボーレートの数値がそのまま送れるデータ量になるわけではありません。 8N1では、8ビットのデータを送るためにスタートビットとストップビットを含めて10ビット分の時間を使います。 115200bpsなら、1秒間に送れるデータは理論上最大で115200 ÷ 10 = 11520バイト(約11.5kB)です。ASCII文字なら最大11520文字に相当します。
電圧レベルとRS-232との違い
UARTはHighとLowを電圧で表しますが、何ボルトを使うかは機器によって異なります。 マイコンやルーターの基板に出ているUARTの端子は、0VをLow、3.3VをHighとする機器が多く、5Vの機器もあります。 例えばRaspberry PiのUARTは3.3Vで動作し、5Vの機器を直接つなぐと壊れます。
古いPCのシリアルポート(D-sub 9ピンのCOMポート)は、RS-232という規格の電圧を使います。 RS-232は正負の電圧で信号を表し、1と0の電圧の向きも基板上のUARTとは逆になります。 RS-232のケーブルを基板のUART端子に直接つなぐと、機器を壊すおそれがあります。
| 項目 | 基板上のUART端子 | RS-232 |
|---|---|---|
| 主な場所 | マイコン、ルーター、SBCの基板上のピン | 古いPCや産業機器のD-sub端子 |
| 電圧の例 | Low=0V、High=3.3Vまたは5V | おおむね±3〜15Vの正負の電圧 |
| データの1 | High(正の電圧) | 負の電圧 |
| PCとの接続 | USBシリアル変換アダプター(3.3V用・5V用) | RS-232用のUSBシリアル変換ケーブル |
基板上のUART端子に使う変換アダプターは「USB-TTL」などとも呼ばれます。購入時や接続前に、アダプターの信号電圧が対象機器と同じかを確かめてください。 電圧を切り替えるスイッチやジャンパーが付いた製品もあります。 アダプターのTX・RXの信号電圧とVCC端子の電圧は別の場合があるため、それぞれ製品の仕様で確認します。
PCとつなぐ:USBシリアル変換アダプター
一般的なPCから基板上のUART端子に接続するには、USBシリアル変換アダプターを使います。 アダプターはUSBで受け取ったデータをUARTの信号に変換し、PC側からはシリアルポートとして見えます。 変換チップにはCH340、CP2102、FT232Rなどがあり、OSによってはドライバーが必要です。
- Windows:デバイスマネージャーで「COM3」のようなCOMポートとして表示される
- Linux:
/dev/ttyUSB0や/dev/ttyACM0のようなデバイスファイルとして表示される
PCでは、Tera Term、PuTTY、minicom、screenなどの端末ソフトでポートを開き、ボーレートと8N1などの設定を対象機器に合わせます。
文字化けや何も表示されないとき
うまく通信できないときは、次の点を順に確かめると原因を絞り込めます。
| 症状 | 考えられる原因 |
|---|---|
| 意味のない記号が表示される | ボーレートが合っていない、GNDがつながっていない・接触が悪い |
| 何も表示されない | TXとRXを交差させていない、開いているポートが違う、機器側でUARTが無効になっている |
| 表示はされるが入力できない | PCのTXから機器のRXへの線がつながっていない、端末ソフトのフロー制御の設定が合っていない |
| PCがポートを認識しない | 変換チップのドライバーがない、充電専用のUSBケーブルを使っている |
配線の取り違えや信号電圧の違いは、機器の故障につながることがあります。接続前に端子の役割と信号電圧を確認します。
近い用語との違い
- シリアル通信:データをビット単位で順に送る方式の総称です。UARTはその代表的な方式の一つで、USBやI2C、SPIもシリアル通信に含まれます。
- I2C・SPI:基板上の部品同士をつなぐ通信方式です。UARTと違い、タイミングを合わせるクロック線を使う同期式で、1つの機器から複数の部品を制御できます。UARTは基本的に1対1でつなぎます。
- RS-232:PCの古いシリアルポートで使われてきた電圧や端子の規格です。UARTの回路が作ったデータを、RS-232の電圧に変換して送る構成が一般的でした。
- シリアルコンソール:UARTなどのシリアル通信を使って機器にログインし、コマンドを操作する仕組みです。UARTは通信の手段、コンソールはその使い方の一つです。
おまけ:OpenWrt機器のシリアルコンソール
私が良く技術記事で取り上げるOpenWrtを入れたルーターでは、ネットワーク設定を間違えると、SSHやWeb画面から操作できなくなることがあります。 UARTのシリアルコンソールはネットワークを使いません。コンソールが利用でき、OSやログイン機能が動作していれば、そのような状態でもログインして設定を直せることがあります。 機種や設定によっては、起動ログを見て起動に失敗する原因を調べたり、ブートローダーを操作したりすることもできます。
ただし、すべての機器でUARTの端子がすぐ使えるとは限りません。基板に端子のパッドだけがある機種や、ファームウェア側でコンソールが無効になっている機種もあります。
Raspberry Pi 3BとOpenWrtでの実際の接続手順は、【第9回】OpenWrt開発入門 UART接続によるコンソールログイン方法で紹介しています。 ネットワークが使えないときのファイルのやり取りは、ファイル転送の記事のUARTの節を参照してください。 ChromeやEdgeから使えるWebシリアルコンソールも用意しています。
参考資料
- OpenWrt: Serial Console — 配線、電圧レベル、よく使うボーレート
- Raspberry Pi Documentation: Configure UARTs — 3.3Vの信号、GPIO14・15、既定のボーレート
- Texas Instruments: UCD3138 UART — 待機時のレベル、スタートビット、データの送信順
- Microchip: USART Frame Formats — データビット数、パリティ、ストップビット
- Analog Devices: Selecting Mixed-Signal Components for Digital Communication Systems — ビットレートとボーレート
- FTDI: TTL-232R-3V3 — 信号電圧とVCC出力電圧が異なる製品の例
- The Linux Documentation Project: Serial HOWTO 20. Voltages — RS-232の電圧と1・0の表し方