我正在讀取藍牙COM端口,從微控制器獲取數據。 初始化端口後,我用這來讀取端口:檢測COM端口是否已關閉
while(1)
if(WaitCommEvent(com_hnd, &dwEventMask, NULL))
這工作得很好,但如果我關閉COM端口,程序將在這個循環永遠等待,而不檢測的事實,COM端口不見了(我有其他的if(),我在那裏檢查錯誤)。
如何檢查並確認它是否仍然打開?
我正在讀取藍牙COM端口,從微控制器獲取數據。 初始化端口後,我用這來讀取端口:檢測COM端口是否已關閉
while(1)
if(WaitCommEvent(com_hnd, &dwEventMask, NULL))
這工作得很好,但如果我關閉COM端口,程序將在這個循環永遠等待,而不檢測的事實,COM端口不見了(我有其他的if(),我在那裏檢查錯誤)。
如何檢查並確認它是否仍然打開?
正如評論中所提到的,您可能需要一些外部方法來停止等待,如事件+ WaitForMultipleObjects()。您也可以等待從CreateFile獲取的實際COM端口句柄。
你確實需要使用WaitCommEvent嗎?據我所知,如果你正在使用握手信號和其他這種古怪的話,你應該只需要這個功能。如果您只對數據感興趣,則可以使用ReadFile。根據我的經驗,該功能更可靠。
我有類似的COM端口設備,並發現他們已經被斷開的最可靠的方法工作似乎是檢查ReadFile的結果:
BOOL result;
result = ReadFile(...);
if(result == FALSE)
{
DWORD last_error = GetLastError();
if(last_error == ERROR_OPERATION_ABORTED) // disconnected ?
{
close(); // close the port
}
}
我當然不知道是否不這可以在你的特定情況下工作,但是我在一些生產代碼中使用這種方法,這些代碼已經結束了多個蹩腳的USB到串行適配器。
IIRC,請確保使用[SetCommTimeOuts]設置超時(http://msdn.microsoft.com/en-us/library/windows/desktop/aa363437(v = vs.85).aspx) – JimR 2012-02-13 10:19:34
沒有,在5秒.. – Radu 2012-02-13 10:24:17
那麼,這是馬虎。模擬COM端口的驅動程序通常很脆弱。你可以通過使用第三個參數來部分地解決它,允許你使用WaitForMultipleObjects(),這樣你也可以用事件來中斷等待。但隨後重新開放該港口可能非常危險。最好先查找驅動程序更新。 – 2012-02-13 11:20:19