N
シリアルポートから正確にバイトを読み取るにはどうすればよいですか?ポートで少なくともN
バイトが使用可能になるか、事前設定されたタイムアウトが期限切れになるまで、スレッドをブロックする必要があります。両方のtimout値は、N
実行時に可変である必要があります。
注:Linuxでは、ブーストの有無にかかわらずC /C++を使用します。
N
シリアルポートから正確にバイトを読み取るにはどうすればよいですか?ポートで少なくともN
バイトが使用可能になるか、事前設定されたタイムアウトが期限切れになるまで、スレッドをブロックする必要があります。両方のtimout値は、N
実行時に可変である必要があります。
注:Linuxでは、ブーストの有無にかかわらずC /C++を使用します。
VMIN
その目的のためにtermiosに属性があります。read()
使用可能なバイト数が不足している場合に戻るのを防ぐために使用できます。
例:
tcgetattr( fd, &termiosv );
termiosv.c_cc[VMIN] = N;
termiosv.c_cc[VTIME] = 20;
tcsetattr( fd, TCSANOW, &termiosv );
注:次の効果がselect()
あります。使用可能なバイトが1バイトのみで、VMIN> 1の場合、Selectはfdの可読性を示します。
残念ながら、ハンスが示唆しているように、バイトストリームのみを通信する通信チャネルには、原則として、バイトをプロトコルユニットにブロックするための魔法の呼び出しはありません。自分で行う必要があります。それほど難しいことではありません。
同様にタイムアウトします。COMポートドライバーには通常、一定の間隔でバイトが受信されなかった場合に起動するタイムアウトがありますが、その1バイトよりも複雑なプロトコルユニットをタイムアウトすることはできません。そのようなことをする必要がある場合、私は通常、バイトを受け取り、プロトコルユニットオブジェクトが完全で健全性チェックされるまでアセンブルする1つのスレッドを使用してから、それらをPCキューにプッシュします。別のスレッドがタイムアウトしてキューを待機します。