2012-02-13 174 views
1

我正在讀取藍牙COM端口,從微控制器獲取數據。 初始化端口後,我用這來讀取端口:檢測COM端口是否已關閉

while(1) 
if(WaitCommEvent(com_hnd, &dwEventMask, NULL)) 

這工作得很好,但如果我關閉COM端口,程序將在這個循環永遠等待,而不檢測的事實,COM端口不見了(我有其他的if(),我在那裏檢查錯誤)。

如何檢查並確認它是否仍然打開?

+1

IIRC,請確保使用[SetCommTimeOuts]設置超時(http://msdn.microsoft.com/en-us/library/windows/desktop/aa363437(v = vs.85).aspx) – JimR 2012-02-13 10:19:34

+0

沒有,在5秒.. – Radu 2012-02-13 10:24:17

+1

那麼,這是馬虎。模擬COM端口的驅動程序通常很脆弱。你可以通過使用第三個參數來部分地解決它,允許你使用WaitForMultipleObjects(),這樣你也可以用事件來中斷等待。但隨後重新開放該港口可能非常危險。最好先查找驅動程序更新。 – 2012-02-13 11:20:19

回答

2

正如評論中所提到的,您可能需要一些外部方法來停止等待,如事件+ 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到串行適配器。

+0

實際上,我在WaitCommEvent()中使用ReadFile(),並且在ReadFile()上也有錯誤檢查,並且沒有檢測到錯誤:/ – Radu 2012-02-13 19:32:54

+0

我試過ReadFile )沒有WaitCommEvent(),仍然沒有變化:/它永遠等待... – Radu 2012-02-13 19:56:56

+0

好吧,實際上它工作,ReadFile()本身將返回一段時間後,如果沒有讀取。謝謝! – Radu 2012-02-14 00:49:24