
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 | 追加ビットなし | 誤り検出なし |
E | 1の総数が偶数 | 偶数個のビット反転を検出できない |
O | 1の総数が奇数 | 検出能力は同じで規則が逆 |
| マーク / スペース | 常に1 / 常に0 | 対応する機器が限られる特殊なモード |
パリティで検出できる誤りは一部だけで、誤りの位置特定や訂正はできません。メッセージ全体の完全性には、UARTより上位の層でCRCまたはチェックサム、シーケンス番号、再送手順が必要です。ストップビットはハイです。ストップビットを期待する時点でローなら、通常はフレーミングエラーになります。
ボーレートとクロック誤差
ボーは毎秒のシンボル数です。二値UARTでは通常、一つのシンボルが一ビットを運ぶため、9600ボーは通常9600 bit/sです。ビット時間はTb = 1 / baudです。
| 速度 | Tb | 8N1フレームの時間 |
|---|---|---|
| 9,600 baud | 104.17 µs | 1.042 ms |
| 57,600 baud | 17.36 µs | 173.6 µs |
| 115,200 baud | 8.681 µs | 86.81 µs |
| 1,000,000 baud | 1.000 µs | 10.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未使用、小さなバッファ |
| ブレーク | フレームより長くラインがロー | 意図的なブレーク、短絡、機器の停止 |
115200, 8N1、LSBから先、フロー制御なし、3.3 V CMOSのように設定をすべて記録します。TX ↔ RX、共通グランド、トランシーバーの電源とDEを確認します。- 一ビット区間を測定します。115200ボーでは約8.68 µsです。
- 診断用のパターンとして
0x55、次に0x00と0xFFを送ります。 - パリティ、フレーミング、オーバーランの各フラグを確認します。文字化けだけでは原因は特定できません。
よくある落とし穴
- 115200ボーを115200バイト/sとみなすこと。
8N1の上限は11,520バイト/sです。 - CMOS接続でTX/RXを二重に交差させる、または共通グランドを省くこと。
- RS-232をGPIOに直接接続すること。
- CRCの代わりにパリティだけでメッセージを保護しようとすること。
- バッファ満杯、電圧レベルの不一致、グランドのノイズ、RS-485の衝突でも似た症状が出るのに、すべてをボーレートのせいにすること。