ElectroDesignForgeElectroDesignForge
信号とインターフェース基礎

UART:フレーム・ボーレート・電気信号レベル

非同期UART通信のスタート/ストップビット、ビット順、パリティ、ボーレート、クロック誤差、通信エラーを説明し、TTL・CMOS・RS-232・RS-485との互換性を確認します。

執筆・技術レビューElectroDesignForge Engineering Team

編集方針を見る

要点: UARTは共通のクロックなしでビットを送ります。受信側は各スタートビットでタイミングを取り直し、計算した時点でデータをサンプリングします。両端でフレーム形式を一致させ、ボーレートの誤差を十分小さく保ち、電気信号レベルを確実に適合させる必要があります。


UARTはフレーム形式であり、電気インターフェースではない

UART(Universal Asynchronous Receiver/Transmitter)はバイトをTX上のビット列に変換し、RXで受信したビット列からバイトを復元します。非同期方式なので、SPIとは異なりクロック線を使いません。

層定義する内容例
UARTフレームアイドル、スタート、データ、パリティ、ストップ、ビット順、速度8N1(115200ボー)
電気的な接続電圧、極性、基準電位、電流、ケーブル3.3 V CMOS、5 Vロジック、RS-232、RS-485

両方の基板が「UARTを使う」としても、そのまま直結できるとは限りません。3.3 VのGPIO出力はRS-232出力ではありません。一般的なロジックの約束では、アイドル時はハイ(マーク)、フレームはローで始まり、ハイで終わります。

フレームの構成

一般的な表記はデータビット数 + パリティ + ストップビット数です。8N1はデータが八ビット、パリティなし、ストップが一ビットを意味します。

待機        開始    D0 D1 D2 D3 D4 D5 D6 D7   パリティ 停止   待機
  1     |     0   |  b0 b1 b2 b3 b4 b5 b6 b7 |   P    |  1  |  1
             <------------- 一ビット時間 Tb = 1 / baud ------------->

スタート、データ、パリティ、ストップ

スタートビットは一ビット時間のあいだローです。下降エッジの後、受信側はおよそ半ビット時間待ってスタートを確認し、各ビット区間の中央付近でサンプリングします。最近のUARTは×8または×16でオーバーサンプリングすることが多いため、正確な判定方法と許容差は周辺回路のマニュアルを確認してください。

データは通常LSBから先に送ります。十六進数の0x53は通常0101 0011と書きますが、送信順は1 1 0 0 1 0 1 0で、これがD0からD7に対応します。オシロスコープで読む際に間違えやすい点です。ハードウェアによっては5から9ビットのデータ長を選べますが、両端で一致させる必要があります。

パリティ設定データとパリティを合わせた規則限界
N追加ビットなし誤り検出なし
E1の総数が偶数偶数個のビット反転を検出できない
O1の総数が奇数検出能力は同じで規則が逆
マーク / スペース常に1 / 常に0対応する機器が限られる特殊なモード

パリティで検出できる誤りは一部だけで、誤りの位置特定や訂正はできません。メッセージ全体の完全性には、UARTより上位の層でCRCまたはチェックサム、シーケンス番号、再送手順が必要です。ストップビットはハイです。ストップビットを期待する時点でローなら、通常はフレーミングエラーになります。

ボーレートとクロック誤差

ボーは毎秒のシンボル数です。二値UARTでは通常、一つのシンボルが一ビットを運ぶため、9600ボーは通常9600 bit/sです。ビット時間はTb = 1 / baudです。

速度Tb8N1フレームの時間
9,600 baud104.17 µs1.042 ms
57,600 baud17.36 µs173.6 µs
115,200 baud8.681 µs86.81 µs
1,000,000 baud1.000 µs10.00 µs

8N1フレームには十ビット時間が必要です。したがって最大ペイロード速度はbaud × 8 / 10となり、115200ボーで連続送信しても、プロトコルのオーバーヘッドを除いた上限は11,520バイト/sです。

送信側と受信側のクロックは独立しています。サンプリング時刻のずれはフレーム内で累積します。累積タイミング誤差 ≈ ビット間隔の数 × 両端の相対周波数誤差の合計です。ジッタ、分周器の量子化、ノイズ、遅いエッジの余裕を残し、ずれを半ビット時間より十分小さくしてください。設計上の目安として合計の相対誤差を約2%未満にすることがありますが、普遍的な上限ではありません。実際の許容差はフレーム長、オーバーサンプリング、受信器の設計で決まります。±1%の発振器を両端で使うと、最悪では差が2%になります。分周器による誤差も確認してください。システムクロックから115200を正確に生成できるとは限りません。

CMOS、TTL、RS-232、RS-485

「TTL」「CMOS」は略称として使われます。必ず実際のデバイスの入力しきい値と絶対最大定格を確認してください。

インターフェースUARTのアイドル状態代表的な電圧3.3 V UARTに直結可能か
3.3 V CMOSハイ0 / 3.3 V付近しきい値が合えば可能
5 Vロジックハイ0 / 5 V付近入力が5 V耐圧の場合のみ
RS-232負電圧(マーク)−5~−12 V / +5~+12 Vが一般的不可。RS-232トランシーバーが必要
RS-485差動信号A/Bペア不可。RS-485トランシーバーが必要

短いロジックレベルの接続では、TX_AをRX_Bに、TX_BをRX_Aにつなぎ、グランド基準を共有します。最初は動作して見えても、5 V出力を非対応の3.3 V入力につなぐと破損する可能性があります。

RS-232では電圧の大きさだけでなく極性も反転します。アイドル時のロジック1は通常負電圧、スタートの0は正電圧です。MAX232系のトランシーバーは電圧変換と反転を行います。RS-485は差動の物理層であり、「強力なUART」ではありません。UARTはDIを駆動してROを読み、トランシーバーがA/Bを駆動します。イネーブル制御(DE)、終端、バイアス、ケーブルの構成、半二重での衝突制御も設計に含まれます。

エラーと立ち上げ時の確認

表示一般的な意味主な原因
パリティエラー受信したパリティが不一致ノイズ、設定違い、タイミング余裕不足
フレーミングエラーストップビットが無効速度違い、極性反転、ブレーク
オーバーラン前のバイトを処理する前に次のバイトが到着割り込みの遅延、DMA未使用、小さなバッファ
ブレークフレームより長くラインがロー意図的なブレーク、短絡、機器の停止
  1. 115200, 8N1、LSBから先、フロー制御なし、3.3 V CMOSのように設定をすべて記録します。
  2. TX ↔ RX、共通グランド、トランシーバーの電源とDEを確認します。
  3. 一ビット区間を測定します。115200ボーでは約8.68 µsです。
  4. 診断用のパターンとして0x55、次に0x00と0xFFを送ります。
  5. パリティ、フレーミング、オーバーランの各フラグを確認します。文字化けだけでは原因は特定できません。

よくある落とし穴

  • 115200ボーを115200バイト/sとみなすこと。8N1の上限は11,520バイト/sです。
  • CMOS接続でTX/RXを二重に交差させる、または共通グランドを省くこと。
  • RS-232をGPIOに直接接続すること。
  • CRCの代わりにパリティだけでメッセージを保護しようとすること。
  • バッファ満杯、電圧レベルの不一致、グランドのノイズ、RS-485の衝突でも似た症状が出るのに、すべてをボーレートのせいにすること。

参考文献