なにやらハード/デバイスの世界では、外部連携するのにシリアル通信を用いることが多いようです。たとえば、Arduino がそうだし、ロボットアームとかもシリアル通信で動きのデータをリアルタイムにやり取りするものもあるらしいです。
シリアル通信が「シリアルにデータを送ること」とうのはわかるのですが、具体的に考え出すとモヤッとしてしまう部分があり、シリアル通信についてもうちょっと具体的な雰囲気をつかむべく、 最近勉強している openFrameworks ではシリアル通信がどう実装されているのか、ofSerial のソースをちょっと見てみました。
前述した通りシリアル通信のしくみとか規格とかをよく知らないので、あくまでざっとみて、気付いた点だけ。
(※ openFrameworks Advent Calendar 2013 - Qiita 12日目の記事です)
Linuxのシリアル通信ライブラリを使用
ヘッダで、termios.hってのをincludeしてる。
#include <termios.h>
ググってみると、『Linux標準のシリアル通信用Cライブラリ』とのこと。
- 参考記事:補助記憶: termios.hについて
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 向けディストリビューションには含まれてなかったです。