[英]Assynchronous serial comms: why does ReadFile() set the event in the OVERLAPPED struct?
我已經利用各種資源將一些(多線程)代碼拼湊在一起,以便從串行端口讀寫數據。 一切正常……除了在線程中無意中從串行端口讀取數據的循環進行了繁忙的等待。 本質上反復發生的是:
我的期望是該事件的全部目的是在有可用數據讀取時發出信號。 但是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函數的文檔包含以下段落:
我根本沒有使用SetCommTimeouts()。 執行GetCommTimeouts()並檢查結果表明端口的設置是COMMTIMEOUTS文檔中本段中描述的值:
您還可以使用WaitCommEvent
函數等待具有特定事件掩碼的事件。 使用CreateFile和WaitCommEvent的代碼示例: 監視通信事件 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.