UARTについてを知る1の記事で、BBC Micro:bit(以後、microbit)のMicroPythonの仕様を参考にUARTというデータのやりとりの方法を見始めた。
HIGH(1)とLOW(0)のみの信号を送ることしかできない配線で、文字列をバイト型の値に変換し、更に2進法の形にすることで、データを送信できる兆しが見えてきた。
※a → 01100001(16進法で0x61と表現する)
今回もMicroPythonのコードを参考にしてUARTの理解を深めていくことにする。
ちなみに今回の話は、CQ出版社から出版されている中森章 桑野雅彦共著 ARMマイコンCortex-M教科書の内容を参考にした。
microbit.uart.init(baudrate=9600, bits=8, parity=None, stop=1, *, tx=None, rx=None)
UART — BBC micro:bit MicroPython 1.0.1 ドキュメント
baudrate=9600は重要なのだけれども、一旦置いといて、parity(パリティ・ビット)とstop(ストップ・ビット)の値からUARTの基礎となるシリアル通信の構造を見ていく事にする。
UARTでは、データ送信が行われていないアイドル状態の時は常に 1 になっており、データ送信を開始する時はスタート・ビットと呼ばれる 0 のの値にする。
ひとまとまりのデータ(今回であれば8ビット)の終了にストップ・ビットと呼ばれる 1 の値を付与する。
図にすると、
このようになる。
注意として、上の図は受信側になるので値の並び方が逆順になるらしい。
アイドル状態の 1 が続き、0 を受け取ったら、その後は値が続き、値の最後だと予想される場所の 1 を確認すると、値の取り込みを終了する。
上の図ではストップ・ビットの左側に 0 の値が一つある。
これをパリティ・ビットと呼び、データ送信時の誤り検出符号となる。
microbitのUARTのパリティの設定にはNone(なし)、microbit.uart.ODD(奇パリティ)とmicrobit.uart.EVEN(偶パリティ)があり、奇パリティで話を進めると、送信したデータのHIGHが奇数であれば 0 、偶数であれば 1 となる。
※偶パリティであれば、値は逆になる
今回の01100001はHIGH(1)が 3 の奇数であるため、パリティ・ビットは 0 となる。
最後にbaudrate(ボーレート)について触れたいが、長くなるので次の記事で触れる事にする。