簡體   English   中英

異步串行通信:為什么ReadFile()在OVERLAPPED結構中設置事件?

[英]Assynchronous serial comms: why does ReadFile() set the event in the OVERLAPPED struct?

我已經利用各種資源將一些(多線程)代碼拼湊在一起,以便從串行端口讀寫數據。 一切正常……除了在線程中無意中從串行端口讀取數據的循環進行了繁忙的等待。 本質上反復發生的是:

  • 重置事件(在讀取循環外部創建),並將其句柄用作OVERLAPPED結構中的hEvent成員。
  • ReadFile()被傳遞給OVERLAPPED結構(以及其他參數)並立即返回
  • WaitForSingleObject()等待OVERLAPPED結構中的事件,但總是立即返回,因為該事件總是在ReadFile()之后設置
  • 然后將GetOverlappedResult()傳遞給相同的OVERLAPPED結構,成功返回,但通常只讀取0個字節

我的期望是該事件的全部目的是在有可用數據讀取時發出信號。 但是ReadFile()設置了事件,那又有什么意義呢? 我想念什么?

下面的簡化代碼演示了我系統上的問題(我已連接COM3)。 完整的代碼非常愉快地讀取和寫入...但是讀者遭受上述情況的困擾:

HANDLE portHandle = CreateFile( "COM3",
                                GENERIC_READ | GENERIC_WRITE,
                                0,
                                NULL,
                                OPEN_EXISTING,
                                FILE_FLAG_OVERLAPPED,
                                NULL );  // succeeds
HANDLE readerEvent = CreateEvent( 0, TRUE, FALSE, _T( "Rx Event" ) );  // succeeds
char buffer[ 200 ];
DWORD bytesRead;
OVERLAPPED reader;
memset( &reader, 0, sizeof( reader ) );
reader.hEvent = readerEvent;
ResetEvent( readerEvent );
ReadFile( portHandle, buffer, 200, &bytesRead, &reader );
if ( WaitForSingleObject( reader.hEvent, 2000 ) == WAIT_OBJECT_0 )
{
    // always true, never has to wait on the event.
}

找到了:ReadFile函數的文檔包含以下段落:

  • 從通信設備讀取時,ReadFile的行為由設置和使用SetCommTimeouts和GetCommTimeouts函數檢索的當前通信超時確定。 如果您無法設置超時值,則可能會發生不可預測的結果。 有關通信超時的更多信息,請參見COMMTIMEOUTS。

我根本沒有使用SetCommTimeouts()。 執行GetCommTimeouts()並檢查結果表明端口的設置是COMMTIMEOUTS文檔中本段中描述的值:

  • MAXDWORD的值與ReadTotalTimeoutConstant和ReadTotalTimeoutMultiplier成員的零值結合在一起,指定讀取操作將立即返回已接收的字節,即使未接收到字節也是如此。

您還可以使用WaitCommEvent函數等待具有特定事件掩碼的事件。 使用CreateFile和WaitCommEvent的代碼示例: 監視通信事件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM