2013-11-25 47 views
2

我正在尋找一種方法來讓Windows串行端口超時,直到它收到數據。如果有某種觸發的事件或某個功能正是我想要的功能,那將會很好。等待COM端口上的數據?

這是我目前的實施。

void waitforCom(unsinged char byte) 
{ 
    while (true) 
    { 
     ClearCommError(serial_handle, &errors, &status); 
     if (status.cbInQue>0) 
     { 
     //check if correct byte 
     break; 
     } 
    } 
} 

回答

2

您可能正在使用的另一個API調用是WaitCommEvent()

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363479(v=vs.85).aspx

,因爲它需要一個OVERLAPPED對象作爲參數調用這個可以異步工作。在你的情況,你會想幹脆就EV_RXCHAR事件等,讓你知道數據已經到達:

OVERLAPPED o = {0}; 
o.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 

SetCommMask(comPortHandle, EV_RXCHAR); 

if (!WaitCommEvent(comPortHandle, &commEvent, &o)) 
{ 
    // Check GetLastError for ERROR_IO_PENDING, if I/O is pending then 
    // use WaitForSingleObject() to determine when `o` is signaled, then check 
    // the result. If a character arrived then perform your ReadFile. 
} 

另外,您可以通過具有螺紋具有傑出ReadFile通話,但使用OVERLAPPED做同樣的事情對象,而不是像MSalters建議的那樣阻塞。

1

我不是一個真正的專家,當談到WINAPI,但有一個在Microsoft Developer Network整篇文章,覆蓋串行通信的主題。文章提到了從端口等待數據的主題,並提供了一個例子。

0

在winAPI級別,對於大多數應用程序,您需要將一個線程專用於串行端口輸入,因爲ReadFile是一個阻塞調用(但有一個超時)。您可以獲得的最有用的事件是讓ReadFile返回。只需將ReadFile放入線程的循環中,並在ReadFile獲取某些數據時將其自己的事件或消息生成到其他線程。

+1

使用線程和阻塞相當粗糙。異步I/O更好。 – MSalters