我已经利用各种来源将一些(多线程)代码拼凑在一起以读取和写入串行端口。一切正常......除了线程中从串口读取数据的循环无意中做了忙等待。基本上反复发生的是:
我的期望是事件的重点是在有数据可供阅读时发出信号。但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.
}
答案 0 :(得分:2)
找到它:ReadFile函数的文档包含以下段落:
我根本没有使用SetCommTimeouts()。执行GetCommTimeouts()并检查结果显示端口的设置是COMMTIMEOUTS文档中本段中描述的值:
答案 1 :(得分:0)
您还可以使用WaitCommEvent
函数等待具有特定事件掩码的事件。使用CreateFile和WaitCommEvent代码示例:Monitoring Communications Events。