Serial Programming: Baudrateの設定

シリアルポートの通信速度の設定の仕方はOSによって違うようで、

Linuxでは:

newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;

のようにtermios構造体のc_cflagに直接設定するが、

MacOSXなどのBSD系では:

cfsetspeed(&newtio,BAUDRATE);

のようにBaudrate設定関数を用いて設定するようだ。(cfsetispeed()/cfsetospeed()のように入出力を個別に設定することも可)。

linuxでもcfsetispeed()/cfsetospeed()が実装されているのでとりあえずこれ使っておけば問題ないかもしれない。

ちなみにtermios.hで例えばB115200はlinux(arm)では

#define B115200 10002

OSX 10.6では

#define B115200 115200

のようにOS/アーキテクチャによって異なって定義されている。
知らなかった。


参考:

(POSIX では、 termios 構造体に格納されたボーレートは正確なものではなく、 ボーレートを操作するために cfgetispeed() と cfsetispeed() が提供されている。 c_cflag 内の CBAUD で選択されたビットを使うシステムもあれば、 sg_ispeed や sg_ospeed といった独立したフィールドを使うものもある。)

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/termios.3.html