Windows WaitCommEvent для ожидания n символов - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь настроить UART / последовательный порт в Windows. Устройство, к которому я подключаюсь, отправит мне 10 символов, а затем мне нужно проанализировать и ответить 30 символами. Мне нужно попытаться ответить менее чем за 2 миллисекунды.

Я планирую использовать CreateFile синхронно.

Я планирую использовать следующие звонки

 SetCommMask (hPort, EV_RXCHAR | EV_ERR); //receive character event
 WaitCommEvent (hPort, &dwCommModemStatus, 0); //wait for character 
  1. Есть ли способ настроить WaitCommEvent на ожидание n символов?
  2. Кроме того, нужно ли мне вызывать SetCommMask перед каждым вызовом WaitCommEvent? Если да, то какие символы появляются перед тем, как я вызову SetCommMask?
  3. Одним из возможных решений, которое я использую, является комбинация событий, управляемых опросом, пока я не получу нужное количество символов. Это хороший компромисс?

1 Ответ

0 голосов
/ 06 января 2019

Ответ - не использовать 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
...