4

Nシリアルポートから正確にバイトを読み取るにはどうすればよいですか?ポートで少なくともNバイトが使用可能になるか、事前設定されたタイムアウトが期限切れになるまで、スレッドをブロックする必要があります。両方のtimout値は、N実行時に可変である必要があります。

注:Linuxでは、ブーストの有無にかかわらずC /C++を使用します。

4

2 に答える 2

2

VMINその目的のためにtermiosに属性があります。read()使用可能なバイト数が不足している場合に戻るのを防ぐために使用できます。

例:

tcgetattr( fd, &termiosv );

termiosv.c_cc[VMIN]  = N;
termiosv.c_cc[VTIME] = 20;

tcsetattr( fd, TCSANOW, &termiosv );

VMINの詳細

注:次の効果がselect()あります。使用可能なバイトが1バイトのみで、VMIN> 1の場合、Selectはfdの可読性を示します。

于 2012-12-19T13:26:11.447 に答える
1

残念ながら、ハンスが示唆しているように、バイトストリームのみを通信する通信チャネルには、原則として、バイトをプロトコルユニットにブロックするための魔法の呼び出しはありません。自分で行う必要があります。それほど難しいことではありません。

同様にタイムアウトします。COMポートドライバーには通常、一定の間隔でバイトが受信されなかった場合に起動するタイムアウトがありますが、その1バイトよりも複雑なプロトコルユニットをタイムアウトすることはできません。そのようなことをする必要がある場合、私は通常、バイトを受け取り、プロトコルユニットオブジェクトが完全で健全性チェックされるまでアセンブルする1つのスレッドを使用してから、それらをPCキューにプッシュします。別のスレッドがタイムアウトしてキューを待機します。

于 2012-12-19T12:24:21.940 に答える