好,一個是SO蜂羣思維...上COM端口的Win32重疊READFILE歸國ERROR_OPERATION_ABORTED
我有有碼 - 直到今天 - 運行在許多系統上就好了,並部署在許多網站。它涉及從串口讀取和寫入數據的線程。
試圖檢出一個新設備,我的代碼被淹沒了995個ERROR_OPERATION_ABORTED錯誤,在ReadFile之後調用GetOverlappedResult。有時閱讀會起作用,othertimes我會得到這個錯誤。只是忽略錯誤而重試會令人吃驚 - 在不丟失任何數據的情況下工作。不需要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位,爲我的罪過。
在我把這個問題放在「別人的問題」之前,有沒有人有任何想法可能會導致這種情況?
我不認爲這是你的問題,但你沒有正確使用`WaitForSingleObjectEx`。您應該檢查(1)`dwWait == WAIT_OBJECT_0`或(2)`dwWait == WAIT_TIMEOUT && dwError == ERROR_IO_PENDING`。 – jww 2012-09-20 17:56:27