と を使用してシリアルポートを読み取る Linux プログラムがselect()ありread()ます。正常に動作しますが、パフォーマンスの問題があります。
read()プログラムは、1 回の呼び出しで 1 ~ 4 バイトのデータしか受信しません。そして、それは不必要なオーバーヘッドを引き起こします。
問題を回避するために、VTIME を 20 (2 秒) に、VMIN を 9 に設定しました。
tcgetattr( fd, &termiosv );
termiosv.c_cc[VMIN] = 9;
termiosv.c_cc[VTIME] = 20;
tcsetattr( fd, TCSANOW, &termiosv );
select()ただし、使用可能なバイトが 1 ~ 4 バイトしかない場合でも、すぐに戻ります。プログラムからのトレース:
2012.03.31 14:31:34 Data from serial:
0000: 7E A0
2012.03.31 14:31:34 Data from serial:
0000: 07 21 03 71
2012.03.31 14:31:34 Data from serial:
0000: 13 63 7E
私の質問は次のとおりです。
VTIME および VMIN シリアル ポート オプションは で動作しselectますか?
それが機能するはずなのに、なぜselect復帰が早すぎるのでしょうか?
非正規モードが使用されます。シリアル ポートの構成は次のとおりです。
~ # stty -F /dev/ttySC0 -a
speed 9600 baud; rows 24; columns 80;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O;
min = 9; time = 20;
-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke
~ #