その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

シリアル通信クラス ofSerial のソースをのぞいてみる

なにやらハード/デバイスの世界では、外部連携するのにシリアル通信を用いることが多いようです。たとえば、Arduino がそうだし、ロボットアームとかもシリアル通信で動きのデータをリアルタイムにやり取りするものもあるらしいです。


シリアル通信が「シリアルにデータを送ること」とうのはわかるのですが、具体的に考え出すとモヤッとしてしまう部分があり、シリアル通信についてもうちょっと具体的な雰囲気をつかむべく、 最近勉強している openFrameworks ではシリアル通信がどう実装されているのか、ofSerial のソースをちょっと見てみました。


前述した通りシリアル通信のしくみとか規格とかをよく知らないので、あくまでざっとみて、気付いた点だけ。


(※ openFrameworks Advent Calendar 2013 - Qiita 12日目の記事です)

Linuxのシリアル通信ライブラリを使用

ヘッダで、termios.hってのをincludeしてる。

#include <termios.h>


ググってみると、『Linux標準のシリアル通信用Cライブラリ』とのこと。

read/write処理はシンプル

readByte のコードから、エラーチェックとか、win向けコードとかを省くと、以下のようにシンプルになる。

int ofSerial::readByte(){

    unsigned char tmpByte[1];
    memset(tmpByte, 0, 1);

    int nRead = read(fd, tmpByte, 1);

    return (int)(tmpByte[0]);
}

writeByte も似たようなもので、read/write 処理では特殊なことはしていない(termiosの関数を呼んだり、何らかの規格に準拠した処理を行ったりはしていない)。

setupでアレコレしている

長いので載せないが、 ofSerial::setup(string portName, int baud) のコードを見ると、ここで termios.h の関数を呼んでて、ハードや規格に準拠した処理もここで行われている。シリアルポートを開いたり、云々。

まとめ

oF のシリアル通信クラス ofSerial のソースを素人目でざっと見てみて、

  • termios という Linux 標準のシリアル通信用ライブラリを使用している
  • 規格とかハードにまつわるアレコレは setup メソッド内で行われている
  • read/writeは普通のバッファからの読み取り/書き込み処理

ということがわかりました。


ちなみに当然ながらこのクラスは oF の iOS 向けディストリビューションには含まれてなかったです。