2014-09-22 55 views
0

我正在通過串行端口以重疊的方式處理非標準調制解調器。除了從電信線路讀取和寫入,我必須檢查控制線,如CTSDSR使用WaitCommEvent()函數。取消WaitCommEvent重疊串行I/O

DWORD EvtMask; 
/// (some scopes/levels ommitted) 

const BOOL syncChange = WaitComEvent(hFile, &EvtMask, &overlapped); 
if (!syncChange) { 
    assert(GetLastError() == ERROR_IO_PENDING); 
    /// *background activity* probably writing into EvtMask 
    /// until overlapped.hEvent gets signalled 
} 

在(幾乎所有)情況下的函數調用表示*background activity*,我得伺候overlapped.hEvent發生。由於我還在等待其他來源的事件(如用戶輸入引起的IPC,程序終止),因此我使用WaitForMuiltipleObjects()函數。但是,如果阻止等待完成其他原因而不是控制線更改,如何停止EvtMask上的後臺活動?我所基於的代碼目前使用的是SetCommMask(hFile, 0),但我沒有找到適合的可靠參考。

我還觀察到控制線的更改不能正確支持的情況(驅動程序?,VM?),所以我必須執行切片等待以及中間檢查。

必須做些什麼安全地離開變量EvtMask的範圍?

+0

你必須調用CancelIo()。用戶輸入通常不是取消I/O的理由。你有一箇中國幸運餅乾,說你會完全重寫這個。 – 2014-09-22 12:08:59

+0

@HansPassant哈哈,有很多重寫... – Wolf 2014-09-22 12:18:06

+0

@HansPassant我改變了這個問題,還有另一個(重要的)理由被考慮。現在它對你更有意義嗎?謝謝! – Wolf 2014-10-10 11:59:19

回答

1

你的代碼是正確的,並通過the documentation,其中明確表示完全支持:

如果一個進程試圖通過使用SetCommMask功能,而重疊WaitCommEvent操作是改變設備句柄的事件屏蔽正在進行中,WaitCommEvent立即返回。

我在「真實」串行端口和USB虛擬串行端口仿真上都使用了這個事實,並且它可以可靠地工作。

(在我的具體情況,我在看的EV_TXEMPTY這樣我就可以保證電線某些傳輸之間的最小間隔)

+0

不錯,這個部分對我來說*不是很清楚。它混合了WaitCommEvent-調用,並且該操作在後臺啓動。儘管如此,謝謝你看看它。它絕對有幫助:-) – Wolf 2014-10-10 12:46:53

+0

只是一個小細節:在用零掩碼調用'SetCommMask'之後,您是否需要再次調用'WaitCommEvent'? – Wolf 2014-10-13 07:50:12

+0

@Wolf:掛起的WaitCommEvent操作將立即完成(或者至少很快 - 不要假設在調用SetCommMask後立即返回內存)。因此,如果您想再次收到通知,則必須再次致電。 – 2014-10-13 13:03:30