UART(ユーアート)通信とは、シリアル通信の1つでマイコン間の通信などで頻繁に使われます。
ここでは、ArduinoのUART通信を参考に実用的な知識をまとめます。
- UARTについて知りたい
- 聞いたことはあるけど具体的なイメージが湧いていない
準備物
●Arduino uno
●ロジックアナライザ
●解析ソフト pluseview
使用するスケッチ
ArduinoのUART通信でやり取りされているデータを見ながら、UARTのプロトコルについてまとめていきます。
今回使用するスケッチはパソコンから送られたデータをArduinoで受け取り、1文字ずつ改行しながらパソコンへ送り返すスケッチです。
パソコンからデータを送るには、Arduino IDEのシリアルモニタを使用します。
int data = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
data = Serial.read();
Serial.write(data);
Serial.write("\n");
Serial.flush();
}
}
また、ArduinoのUART信号をパソコンで確認する方法は以下の記事でご紹介しているので、試してみたい方は参考にしてもらえると嬉しいです。

UARTの仕様
上記のスケッチを実際に動かして取得したUARTの通信データを見てみましょう。
以下がその通信データです。
このデータはパソコンから「aiueo」というデータをArduinoへ送り、Arduinoから「a (\n) i (\n) u (\n) e (\n) o (\n)」というデータを返した例です。
(\n)は改行を表しています。

- Rx:パソコン → Arduino
- Tx:Arduino → パソコン
順番にUARTの仕様を見ていきたいと思います。
電圧
UARTは0V~5Vの間で動作します。
Lowは0.8V以下
Highは2.0V以上である必要があります。
ボーレート
シリアル通信には、信号を正しいタイミングで読み取るための方式として、同期式と調歩同期式の2方式があります。
UARTは調歩同期式です。
- 同期式
信号線にマイコンからクロック信号も一緒に送り、そのクロック信号のタイミングに合わせて通信データを読み取ることで正しくデータを送受信することができます。 - 調歩同期式
あらかじめ、お互いでデータを読み取るタイミングを決めておき、そのタイミングに合わせて通信データを読み取ることで正しくデータを送受信することができます。
ArduinoでUART通信をするときはTx(データ送信)とRx(データ受信)の2本のピンを使いますが、どちらもデータが通るための通信線なので、クロック信号は送っていません。
なので、あらかじめパソコンとArduinoで通信する速度(ボーレート)を決めておく必要があります。
それがスケッチの以下の部分に当たります。
Serial.begin(9600);
あらかじめ9600bpsでデータを送受信するよう決めてあるので、PC側も9600bpsで設定されています。
上記の1行でArduinoも9600bpsに設定しています。
通信データの確認
9600bps(bit per second)は、1秒間に9600ビットのデータを送ることができます。
1ビットを送るのにかかる時間は、1÷9600≒0.0001秒、つまり100マイクロ秒です。
通信データの1bitを拡大した画像を確認してみましょう。

1メモリが100μsなので、確かに1bitがおよそ100マイクロ秒で送受信されていることがわかります。
Arduinoもパソコンも、およそ100マイクロ秒ごとに電圧がLowかHighかを確認すればいいことになります。
余談
UARTは2本線で通信しますが、どちらもデータの通り道として使われます。
それぞれ、Arduinoからパソコン、パソコンからArduinoの一方通行の通り道なので、Arduinoとパソコンは好きな時に自分のデータを送ることができます。
このような方式を全二重通信といいます。
反対に、どちらかが送っているときに、もう片方は送ることができない方式を半二重通信といいます。
通信データを見てみると、パソコンからArduinoへRxでデータを受信している最中にも関わらず、ArduinoからパソコンへTxでデータを送信できていますね。
データビット
データビットとは通信データのひとかたまりの内、データを表す部分のことをいいます。
データビットもあらかじめパソコンとArduinoの間で大きさが決められており、今回は8bitです。
データビットでよく使われる大きさ
- 7
- 8
- 9
通信データの確認

これはパソコンから「a」が送られている時の例です。
「a」はAsciiコードで「0x61」に対応しているので、ひとかたまりのデータで8bit、つまり1Byteのデータが送られていることがわかります。
余談
「a」は16進数で表すと「0x61」となり、2進数で表すと「01100001」となります。
ですが、通信データのデータビットをみると「10000110」という順番で送っています。
これはビットオーダーの末尾からデータを送る方式で「lsb first」という方式になります。
反対に、頭から送る方式を「msb first」といいます。
パソコンとArduinoで違う方式が採用されてしまうと、データがめちゃくちゃになります。
スタートビット・ストップビット
データビットの話をしているときに、「ひとかたまり」という表現を使いました。
というのも、UARTはデータビットの前後にスタートビットとストップビットというものが付いています。
- スタートビット
データビットの頭に付いている1bit分のLow信号です。
UART通信は、何もデータを送信していないときは信号(電圧)がHighの状態になっています。
この状態で、送られてきたデータの1bit目がHighであった場合、それが信号なのか、何も送られていないのか、の区別がつきません。
そこで、必ず1bitめはLowの信号を送るよう決められています。 - ストップビット
データビットの後ろに付いている、1bit分のHigh信号です。(0.5や1.5bitの場合もあります)
UARTはスタートビットを送り、次に決められた数だけデータビットを送ります。
そこから次のかたまりを送るまでに、ストップビット分のHigh信号を送ることが決められています。
通信データの確認

まず、信号はHighの状態で始まっていて、スタートビットで1bitのLow信号が送られた後、8bitのデータビットが送られ、最後にストップビットで1bitのHigh信号が送られています。
連続で送るデータがある場合は、ストップビットの1bitが送られた後に、またスタートビットから始まっていることがわかります。
余談
今回の設定では、UARTは1Byteのデータを送るためにスタートビットとストップビットも合わせると10bitも送る必要があります。
パリティビット
今回の通信データの例には出てきませんが、パリティビットを送信する場合もあります。
- 奇数パリティ
データビットの内、1の数が奇数である場合、データビットの後ろに1を付けます。 - 偶数パリティ
データビットの内、1の数が偶数である場合、データビットの後ろに0を付けます。
パリティビットをつけることで、もしデータビットで1bit分の読み取りミスがあったときに、パリティビットと比べることができるで、データビットが正しいか間違いかを判断することができます。
まとめ
Arduinoの通信データを参考にしてUARTの仕様をまとめました。
Arduinoを使うととても簡単に試してみることができますので、実際に手を動かして理解度を上げてみるといいかもしれません!
コメント