ESP8266のUARTその2までの記事でUARTで二つの端末間の文字列のやり取りを見てきた。

UARTを使用する際に諸々の設定内容があったが、それらに触れずに話を進めてきたので、UARTの詳細を少しずつ見ていくことにしよう。




UARTはUniversal Asynchronous Receiver/Transmitterの略で、非同期でシリアル通信を行う集積回路の一種であるらしい。

UART - Wikipedia



上の図のように、UARTを持つ機械のTXのピンとRXのピンを繋いで値のやり取りを行う。

上の図ではRaspberry Pi(以後Piと略す)のTXピンはBBC Micro:bit(以後microbitと略す)のRXピンに、PiのRXのピンはmicrobitのTXピンに繋ぐ。


今までの記事ではUARTで文字列の送受信を行ったが、Raspberry Piと赤色LEDでパルス幅変調を試すの記事で見たように、



TXやRXを含むGPIOピンはHIGH(または1 : 電流が流れている)かLOW(または0 : 電流が流れていない)の二つの値のやり取りしかできない。

この1 or 0だけでどのように二つの機械の間で文字列を送信していたのだろうか?




abcという値を送信することを考えてみる。

コンピュータにはというものがあって、97というものがあったら、a と解釈するといった形で、数字と文字が対応している。

この時の97の方の値はバイト型として扱われる。

文字コード - Wikipedia


abcという値をバイト型にするとどうなるのか?をGo言語を用いて試してみる。

下記のコードは文字コードをUTF-8で保存して実行する。

/path/to/dir/main.go

package main

import "fmt"

func main() {
	str := "abc"
	fmt.Println("文字列" + str + "をバイト型に変換する")

	b := []byte(str)
	fmt.Println(b)
}

実行結果は

# 念の為、ファイルの文字コードを調べる
$ file -i /path/to/dir/main.go
/path/to/dir/main.go: text/x-c; charset=utf-8

# 実行する
$ go run /path/to/dir/main.go
文字列abcをバイト型に変換する
[97 98 99]

整数の値が3個並んだ値が返ってきた。

整数の値は返ってきたけれども、これだとGPIOの仕様の1 or 0から程遠い。




次にmicrobitでUARTを試した時の設定を見てみると、

microbit.uart.init(baudrate=9600, bits=8, parity=None, stop=1, *, tx=None, rx=None)

UART — BBC micro:bit MicroPython 1.0.1 ドキュメント

bits=8という値がある。


1 or 0の値一つ分を1ビットとし、bits=8は1 or 0の値8個分を1セットにして、値のやりとりを行うという意味になる。

8ビットあれば、00000000〜11111111までの値を表現することが出来、0〜28(=256)の範囲の値を扱えるようになる。

この範囲であれば、文字列aに対応したバイト型97の値を扱う事ができるようになる。


97を8ビットの値に変換すると01100001(16進法で0x61と表現する)になり、この値をGPIOで繋いだ線で送信すればいい。

※abc → 0x610x620x63


次はuart.initの各パラメータを!と言いたいところだが、長くなったので次回にする。