Windows WaitCommEvent等待n个字符

时间:2019-01-06 15:32:38

标签: c++ winapi events serial-port uart

我正在尝试在Windows中设置uart /串行端口。我所连接的设备将向我发送10个字符,然后我需要解析并以30个字符作为响应。我需要尝试在2毫秒内做出响应。

我计划以同步方式使用CreateFile。

我打算使用以下电话

 SetCommMask (hPort, EV_RXCHAR | EV_ERR); //receive character event
 WaitCommEvent (hPort, &dwCommModemStatus, 0); //wait for character 
  1. 是否可以将WaitCommEvent设置为等待n个字符?
  2. 此外,每次调用WaitCommEvent之前都需要先调用SetCommMask吗?如果是这样,在我致电SetCommMask之前会出现什么字符?
  3. 我浮动的一个可能的解决方案是将事件驱动与轮询结合起来,直到获得所需的字符数为止。这是一个很好的妥协吗?

1 个答案:

答案 0 :(得分:0)

答案是不使用SetCommMask和WaitCommEvent。

我可以使用SetCommTimeouts,请求10个字节并将ReadTotalTimeoutConstant设置为x毫秒,这样调用不会永远阻塞。

https://docs.microsoft.com/en-us/windows/desktop/api/winbase/ns-winbase-_commtimeouts

if (!::GetCommTimeouts(m_hCommPort, &timeouts))
    std::cout << "error" << std::endl;

timeouts.ReadIntervalTimeout = 0;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 5000;
timeouts.WriteTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 0;

if (!::SetCommTimeouts(m_hCommPort, &timeouts))
    std::cout << "error" << std::endl;

BYTE Byte;
DWORD dwBytesTransferred;
DWORD dwCommModemStatus;

ReadFile(m_hCommPort, &Byte, 1, &dwBytesTransferred, 0); //read 1