UART入門と実践ガイド:仕組み、設定、信号レベル、トラブルシューティングまで徹底解説
はじめに — UARTとは
UART(Universal Asynchronous Receiver/Transmitter)は、電子機器同士で短距離のシリアル通信を行うための基本的かつ広く使われているインタフェースです。マイクロコントローラ、組込み機器、PCのシリアルポート(過去のもの)、USBシリアル変換アダプタなど、多くの場面で登場します。UARTは非同期方式(クロック信号を別線で送らない)で動作し、ビット単位のフレーミング(スタートビット、データビット、パリティ、ストップビット)によりデータを転送します。
基本的な動作原理
UART通信は次の要素で構成されます。
- アイドル状態(ラインは論理1、mark)
- スタートビット(論理0、space)でフレームの開始を通知
- データビット(通常5〜8ビット、LSBが最初に送られる)
- オプションのパリティビット(偶数/奇数/固定)
- ストップビット(1、1.5、2ビット)でフレーム終了を示す
受信側はスタートビットの立ち下がりを検出してから一定のタイミング(ボーレートに基づく)でビットをサンプリングします。多くのUART実装では内部でオーバーサンプリング(例えば16倍)を行い、タイミングずれの許容を確保します。
ボーレート(baud)とビットタイミング
ボーレートはシンボル(この場合はビット)が送信される速度を示し、通常はbps(bits per second)で表します。例えば115200bpsは1秒間に115200ビットを送る速度です。UARTではボーレートを作るためにクロックを分周して生成します。MCUやUARTコアの仕様により整数分周や小数分周(フラクショナルディバイダ)を使うことがあり、分周誤差によって実際のボーレートに差が出ると通信エラーの原因になります。
実務上、送受信のボーレート誤差は一般に±2%〜±3%以内に収めることが望ましく、多くのアプリケーションは±1%〜±2%で安定します。オーバーサンプリング比が大きいと受信側が多少のクロックずれに耐えられます。
フレーム形式(データビット、パリティ、ストップビット)
代表的な組合せは 8N1(8データビット、パリティなし、1ストップビット)です。その他に7E1(7ビット、偶数パリティ、1ストップ)、8E1、8O1、8N2などがあります。パリティは単純な誤り検出(1ビットの奇偶チェック)で、通信エラーの検出能力は限定的です。アプリケーションでより高い信頼性が必要な場合は上位層でCRCを使うべきです。
信号レベルと物理的インタフェース
UARTの論理的プロトコルは同じでも、物理レイヤ(電気的レベル)は環境によって異なります。
- TTL/CMOSレベル:マイクロコントローラが直接扱う0〜5Vや0〜3.3Vのロジックレベル。ロジックはRS-232と極性が逆(UARTのアイドルは論理1で高レベル)で、電圧範囲に注意が必要。
- RS-232:かつてPCのシリアルポートで主流だった規格。電圧は±3〜±15Vを用い、論理レベルは反転(+Vが論理0など)。直接MCUに接続すると破壊の恐れがあるため、レベル変換(MAX232等)を使う。
- RS-485:差動信号を使う規格で、長距離・複数ノード(マルチドロップ)に適合。半二重(A/Bペアで送受信切替)や全二重の実装がある。終端抵抗とバイアス(プルアップ/プルダウン)が必要な場合が多い。
- USBシリアル(CDC、FTDI、CH340等):USB経由でUARTを仮想COMポートに変換するチップが広く使われている。Linuxでは/dev/ttyUSB*や/dev/ttyACM*として現れる。
ハードウェアフロー制御とソフトウェア制御
伝送が速かったりデバイスのバッファが小さい場合、フロー制御が必要になります。
- ハードウェアフロー制御:RTS/CTSが代表。RTS(Request To Send)、CTS(Clear To Send)で物理的に送信の可否を制御するため、信頼性が高い。
- ソフトウェアフロー制御:ASCII制御文字 XON (DC1, 0x11) / XOFF (DC3, 0x13) を送って送信を停止・再開させる。配線が少ない場合に使えるがデータと混同する危険や遅延がある。
エラーの種類と検出
UART通信で発生する主なエラーは次の通りです。
- フレーミングエラー:ストップビットが期待された状態にないとき。通常クロック同期ずれやラインノイズが原因。
- パリティエラー:パリティビットと計算結果が一致しないときに発生。
- オーバラン(オーバーラン)エラー:受信バッファが満杯で新しいデータを取り逃がした場合。
- ノイズ/ビットエラー:ラインの電気的ノイズや振動でビットが誤検出される。
これらを検出・対処するため、ハード側のフラグやロジックアナライザ、ソフト側のログを併用して原因を突き止めます。アプリケーションレベルではCRCや再送制御を実装することで信頼性を高めます。
UARTとUSART、SPIとの違い
UARTは非同期シリアルの伝送方式を実現する論理ブロックです。USART(Universal Synchronous/Asynchronous Receiver/Transmitter)は同期(クロック同期)モードもサポートする拡張版で、同期通信も行える点が異なります。SPIやI2Cは別の同期/マルチマスター型のシリアルプロトコルであり、用途やトポロジー(ピン数、速度、ワイヤ数、マスター/スレーブ性)で使い分けられます。
実践的な設定例(よく使われる組合せ)
- 基本設定:115200 8N1(多くの開発環境でデフォルト)
- 低速の設定:9600 8N1(古いデバイスやモデム系)
- 産業用途:ボーレートやパリティ、ストップビットは機器仕様に合わせる(例:Modbus RTUは通常8E1または8N1で指定されることがある)
Linuxでの扱い
Linuxではシリアルデバイスが/dev/ttyS*(オンボードUART)、/dev/ttyUSB*(USB-シリアル変換)、/dev/ttyACM*(CDC ACMクラス)などとして現れます。設定はsttyやsetserial、minicom、screen、picocomなどで行います。ボーレートやパリティ、フロー制御の設定はstty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb などで行えます。
ボーレート生成の注意点(例:AVR/ARM)
多くのマイコンUARTでは内部クロックを分周してボーレートを生成します。例えばAVRではUBRRレジスタとオーバーサンプリング係数によりボーレートが決まります(概念式:Baud = F_CPU / (16*(UBRR+1)))。ARMのPL011や他のUARTコアでも整数および小数の分周があり、クロック源、分周精度、クロックジッタが通信品質に影響します。データシートで許容誤差と計算例を確認してください。
ソフトウェアUART(ビットバンギング)
ピンやハードウェアUARTが足りない場合、ソフトウェアでUARTを実装することがあります(Software UART、bit-banged UART)。これにはCPUタイミングの精密さが要求され、割り込みやタスク処理でタイミングが乱れると信頼性が低下します。低ボーレートや単方向通信でのみ実用的です。
物理配線・配慮(信頼性向上のための実務的ポイント)
- 電圧レベルの確認:MCUのTTLと接続先が同じ電圧ロジックか、レベルシフタが必要か必ず確認する。
- RS-232接続にはレベル変換(MAX232系)を使用する。
- 長距離伝送やノイズ環境ではRS-485や差動トランシーバを利用する。終端抵抗とバイアスを適切に設定すること。
- 高ボーレートではツイストペア配線やシールドケーブルを検討し、クリティカルな速度はハードウェアフロー制御で保護する。
- 複数ノードを接続する場合はマルチドロップ設計(RS-485等)とし、衝突回避を設ける。
デバッグとトラブルシューティング
主な手順:
- 設定(ボーレート、データ長、パリティ、ストップビット)が送受信双方で一致しているか確認する。
- 論理レベルが適合しているかをテスターやオシロスコープで確認する(反転している、電圧が足りない等)。
- ロジックアナライザでビット列をキャプチャしてフレーミングや誤りのパターンを解析する。
- フロー制御が原因で止まっていないか、RTS/CTSやXON/XOFFの状態を確認する。
- 受信オーバランやフレーミングエラーのフラグをUARTレジスタやドライバログでチェックする。
セキュリティ上の留意点
UARTは一般に暗号化や認証を持たないプレーンテキスト通信です。デバッグヘッダやブートローダのシリアルコンソールが有効だと、機密情報の露見やリカバリーモードからの改ざんを招く可能性があります。製品設計では物理アクセス制限、シリアルコンソールの無効化や認証、ブートローダの署名検証などを検討してください。
まとめ
UARTはシンプルで理解しやすく、組込み開発における標準的な通信手段です。ただし、設定ミスマッチ、電圧レベルの不一致、クロック誤差、ラインノイズなどによるトラブルがよく起きます。正しい物理インタフェースの選択、ボーレートと分周の確認、適切なフロー制御、エラー検出・訂正の実装により安定した通信を実現できます。設計段階でこれらを考慮すれば、UARTは低コストで堅牢なソリューションになります。
参考文献
- Universal asynchronous receiver-transmitter - Wikipedia
- RS-232 - Wikipedia
- RS-485 - Wikipedia
- Serial port - Wikipedia
- Linux TTY layer - kernel.org
- USB Communications Device Class (CDC) - Wikipedia
投稿者プロフィール
最新の投稿
IT2025.12.13F10キーの完全ガイド:歴史・OS別挙動・開発者向け活用法とトラブルシューティング
IT2025.12.13F9キーの全貌:歴史・OS・アプリ別の挙動と活用テクニック
IT2025.12.13F8キーの完全ガイド:歴史・実用・トラブル対処(Windows・アプリ・開発者向け)
IT2025.12.13F7キー完全ガイド:歴史・OS別挙動・IME・アクセシビリティ・開発者向け対処法

