わかりました、SO ハイブ マインド用の 1 つ...
今日まで、多くのシステムで問題なく動作し、多くのサイトに展開されているコードがあります。これには、シリアル ポートからデータを読み書きするスレッドが含まれます。
新しいデバイスをチェックアウトしようとすると、ReadFile の後に GetOverlappedResult を呼び出す 995 の ERROR_OPERATION_ABORTED エラーでコードがあふれていました。読み取りが機能することもあれば、このエラーが発生することもあります。エラーを無視して再試行するだけで、驚くべきことに、データを削除せずに機能します。ClearCommError は必要ありません。
これがスニペットです。
if (!ReadFile(handle,&c,1,&read, &olap))
{
if (GetLastError() != ERROR_IO_PENDING)
{
logger().log_api(LOG_ERROR,"ser_rx_char:ReadFile");
throw Exception("ser_rx_char:ReadFile");
}
}
WaitForSingleObjectEx(r_event, INFINITE, true); // alertable, so, thread can be closed correctly.
if (GetOverlappedResult(handle,&olap,&read, TRUE) != 0)
{
if (read != 1)
throw Exception("ser_rx_char: no data");
logger().log(LOG_VERBOSE,"read char %d ( read = %d) ",c, read);
}
else
{
DWORD err = GetLastError();
if (err != 995) //Filters our ERROR_OPERATION_ABORTED
{
logger().log_api(LOG_ERROR,"ser_rx_char: GetOverlappedResult");
throw Exception("ser_rx_char:GetOverlappedResult");
}
}
私の最初の推測は、以前に使用したことのない COM ポート ドライバーのせいだと思います (参考までに、Blackmagic Decklink の RS422 ポートです)。
ああ、Vista SP1 Business 32 ビット、念のため。
これを「他の誰かの問題」に分類する前に、これを引き起こす原因について何か考えがある人はいますか?