termios構造体

シリアル通信の設定は、termios構造体で行う。

Man page of TERMIOS

メンバ変数のc_iflag, c_oflag, c_cflag, c_lflag, メンバ配列のc_ccにフラグや値がセットしてあるので、それを出力して、設定を確認する。
ただ、その前に、どんなフラグがあって、どういう値かを確認する。

termios.h
termios.h

termios.hがあった。

開いてみる
開いてみる

開いてみる。

bits/termios.hにありそう
bits/termios.hにありそう

bits/termios.hにありそう。

今度はbits/termios.h
今度はbits/termios.h

今度はbits/termios.hを開く。

定数値があった
定数値があった

定数値があった。

シリアル通信(POSIX編)

あれ?なんか違うなあと思ったら、

【C言語入門】16進数と8進数の変換や表示をする方法 | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト

8進数で定義されてるのか。

設定する前の古い情報oldと、新たに設定する情報tty、の2つの端末情報のフラグを8進数で出力する。

$ vi struct_termios.c
$ gcc struct_termios.c -o struct_termios
$ sudo ./struct_termios
[sudo] bg1 のパスワード:
old.c_iflag = 00000000
old.c_oflag = 00000000
old.c_cflag = 00014262
old.c_lflag = 00000000
old.c_cc[0] = 0
old.c_cc[1] = 0
old.c_cc[2] = 0
old.c_cc[3] = 0
old.c_cc[4] = 0
old.c_cc[5] = 0
old.c_cc[6] = 0
old.c_cc[7] = 0
old.c_cc[8] = 0
old.c_cc[9] = 0
old.c_cc[10] = 0
old.c_cc[11] = 0
old.c_cc[12] = 0
old.c_cc[13] = 0
old.c_cc[14] = 0
old.c_cc[15] = 0
old.c_cc[16] = 0
old.c_cc[17] = 0
old.c_cc[18] = 0
old.c_cc[19] = 0
old.c_cc[20] = 0
old.c_cc[21] = 0
old.c_cc[22] = 0
old.c_cc[23] = 0
old.c_cc[24] = 0
old.c_cc[25] = 0
old.c_cc[26] = 0
old.c_cc[27] = 0
old.c_cc[28] = 0
old.c_cc[29] = 0
old.c_cc[30] = 0
old.c_cc[31] = 0
tty.c_iflag = 00000000
tty.c_oflag = 00000000
tty.c_cflag = 00014262
tty.c_lflag = 00000000
tty.c_cc[0] = 0
tty.c_cc[1] = 0
tty.c_cc[2] = 0
tty.c_cc[3] = 0
tty.c_cc[4] = 0
tty.c_cc[5] = 0
tty.c_cc[6] = 0
tty.c_cc[7] = 0
tty.c_cc[8] = 0
tty.c_cc[9] = 0
tty.c_cc[10] = 0
tty.c_cc[11] = 0
tty.c_cc[12] = 0
tty.c_cc[13] = 0
tty.c_cc[14] = 0
tty.c_cc[15] = 0
tty.c_cc[16] = 0
tty.c_cc[17] = 0
tty.c_cc[18] = 0
tty.c_cc[19] = 0
tty.c_cc[20] = 0
tty.c_cc[21] = 0
tty.c_cc[22] = 0
tty.c_cc[23] = 0
tty.c_cc[24] = 0
tty.c_cc[25] = 0
tty.c_cc[26] = 0
tty.c_cc[27] = 0
tty.c_cc[28] = 0
tty.c_cc[29] = 0
tty.c_cc[30] = 0
tty.c_cc[31] = 0

c_cflagが14262というのがわかった。
ボーレートが115200、CREAD, CLOCAL, CS8, のフラグが立ってた。

あとは、受信処理はTCSETSの時と同じ。
ただ、本来は、ここでボーレートやパリティの設定を互いに違うものにして、通信できない現象を再現したかったが、ボーレートもパリティも他の値も変えても、どうにも通信出来てしまったので、予定を変更して、こんな内容に。

Sample/unixsyscall/struct_termios/struct_termios/src/struct_termios at master · bg1bgst333/Sample · GitHub