AsyncSerial – 非同期UART通信ライブラリ [Mbedライブラリ]

AsyncSerial – 非同期UART通信ライブラリ [Mbedライブラリ]
By Kevin [CC BY (https://creativecommons.org/licenses/by/4.0/deed.en)], via 0x7D.com

UART通信について

一般的に、マイコン同士でのデータのやり取りには、UART(RS-232C)通信を使うことが多いです。

マイコンで用いるシリアル通信には、他にもSPIやI2Cと行った種類のものがありますが、これらはセンサやドライバなどのICとマイコンを接続する場合に用いられることが多いです。ちなみに、PS/PS2のコントローラであるDualShockは、SPI通信を用いています。また、Wiiリモコンに接続するヌンチャクには、I2C通信が使われています。

UART通信は、TX-RX, RX-TX の2線を用いて通信を行います(双方向通信の場合)。ここで言うTXは送信ポートで、RXは受信ポートです。通信が一方向の場合は、1線だけでも通信を行うことができます。

一般的には、どんなマイコンであってもUARTを使用できます。例えば、Arduinoでは、Serial.read()などから利用できるものがUART通信となります。

UARTにおける同期・非同期とは

UARTはMbedでも使用可能で、mbed.hのSerialクラスを用いることで通信できます。しかし、Arduinoのものとは内部のデータ処理において大きな違いがあります。それは同期しているか非同期かという違いです。

まず、ArduinoのSerialは非同期です。UARTのRXポートにデータが到着すると割り込みがかかり、それをFIFO構造になったバッファに収めます(FIFOとは、First in First out, すなわち「先入れ先出し」です。ところてん式バッファとも言います)。そして、Serial.read()が呼ばれた際に、そのバッファから1バイト取り出します。よって、Serial.read()の処理はバッファからデータを取り出すだけですから、すぐに完了します。また送信の際は、Serial.write()が呼ばれると送信バッファにデータを入れ、処理が終了した後、マイコン側の送信準備ができた段階で割り込みがかかり、データが送信されます。

一方で、MbedのSerialは同期します。これはつまり、バッファを持っていないということです。そのため、受信や送信の際には、その処理が終わるまで関数は終了しません。すると、簡単な電子工作なら問題ありませんが、5ms10msを重要視する比較的シビアなシステムになると、そこで時間をロスすることになるため注意が必要です。

AsyncSerialについて

AsyncSerialは、MbedのSerialクラスに受信・送信バッファを追加したものです。

ですから、Mbedにおいて非同期のUART通信を実現できます。また、標準で用意されているメソッドに加え、ArduinoにおけるSerial.peek()やSerial.flush()にあたる機能も備えています。そして、標準ではSerial::readable()の返り値は読み取り可能であるかどうかを示しますが、AsyncSerial::readable()の返り値は受信バッファに何バイトが到着しているかを示します。したがって、ArduinoでのSerial.available()と同じような使い方が可能です。

なお、このライブラリはmbed OS 2向けです。最近ARMはRTOSである mbed OS 5を推していますが、それとは異なるのでご注意ください。

AsyncSerial リファレンス

AsyncSerialのリファレンスは、以下をご覧ください(Mbedのサイトに飛びます)。

https://os.mbed.com/users/babylonica/notebook/asyncserial_jp/

AsyncSerial リポジトリ

AsyncSerialのリポジトリは、以下にあります。右の方にある”Import into Compiler”から使用できます。

https://os.mbed.com/users/babylonica/code/AsyncSerial/docs/tip/classAsyncSerial.html