ハードウェアとインターフェースするためのコードを書いています。ハードウェアは、デバイス内のUSB-シリアルコンバーターを備えたUSB経由でPCに接続します(WindowsではCOMポートデバイスとして表示されます)。
Win32APIReadFileシステムコールに問題があります。宣伝どおりに機能させることができないようです。COMMTIMEOUTS構造を次のように設定しました。
COMMTIMEOUTS ct;
ct.ReadIntervalTimeout = MAXDWORD;
ct.ReadTotalTimeoutconstant = 0;
ct.ReadTotalTimeoutMultiplier = 0;
ct.WriteTotalTimeoutConstant = 0;
ct.WriteTotalTimeoutMultiplier = 0;
if(SetCommTimeouts(device_id_, &ct) == 0)
{
return ERROR; // this is never hit.
}
Win32 APIのドキュメントによると、次のように述べています。
ReadIntervalTimeout
通信回線に2バイトが到着するまでに経過できる最大時間(ミリ秒単位)。ReadFile操作中、期間は最初のバイトが受信されたときに始まります。2バイトの到着間隔がこの量を超えると、ReadFile操作が完了し、バッファリングされたデータが返されます。ゼロの値は、インターバルタイムアウトが使用されていないことを示します。
MAXDWORDの値は、 ReadTotalTimeoutConstantメンバーと ReadTotalTimeoutMultiplierメンバーの両方のゼロ値と組み合わされ て、バイトが受信されていない場合でも、読み取り操作がすでに受信されたバイトをすぐに返すことを指定します。
私が送信しているコマンドは、1バイトの整数を返すことになっています。ほとんどの場合、コマンドはデバイスによって受信され、適切な値を返します。ただし、場合によっては、値を返さないように見え、さらにバイトが受信されるまで(たとえば、デバイスのボタンを押すことによって)ReadFile()がブロックされます。ボタンが押されると、私が期待していた最初の整数応答がボタン押下コードとともに受信されます。これは、デバイス自体に期待する動作ではありませんが、MSDNのドキュメントによると、本来あるべきではないときにReadFile()がブロックされることに関心があります。ここでReadFile()をブロックするための救済策はありますか?