Windows ReadFile () не возвращается, пока не будет прочитано значение sizeToRead

0

В последовательной связи ReadFile не возвращается до чтения столько, сколько параметр sizeToRead.

Это так странно, потому что на самом деле до вчерашнего дня он работает нормально с тем же кодом, тот же самый ноутбук, возвращаясь, хотя он не получает столько же, сколько sizeToRead но любые байты.

Но сегодня мой код показывает странный симптом подобным образом.

serialHandle = CreateFile(L"\\\\.\\COM1",
    GENERIC_READ | GENERIC_WRITE,
    0,
    0,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0);

DCB serialInfo = {0};

GetCommState(serialHandle, &serialInfo)

serialInfo.DCBlength = sizeof(DCB);
serialInfo.BaudRate = CBR_19200;
serialInfo.fBinary = TRUE;
serialInfo.fParity = TRUE;          
serialInfo.fErrorChar = TRUE;
serialInfo.fNull = TRUE;
serialInfo.fAbortOnError = FALSE;   //TODO
serialInfo.ByteSize = 8;
serialInfo.Parity = SPACEPARITY;
serialInfo.StopBits = ONESTOPBIT;
serialInfo.ErrorChar = 0xFF;    

SetCommState(serialHandle, &serialInfo

ReadFile(serialHandle, buffer, numberOfBytesToRead, &numOfBytesRead, NULL)

numberOfBytesToRead - 256, поэтому ReadFile возвращает после получения 256 байтов

  • 0
    Узнайте, что контролирует блокирующее и неблокирующее поведение.
  • 0
    Я знаю блок и неблокирование, но, как я знаю, по умолчанию это блок, и ReadFile должен возвращать, если получен какой-либо байт, но теперь он, кажется, ожидает получения 256 байтов, но не байтов.
Показать ещё 1 комментарий
Теги:
serial-port

1 ответ

2
Лучший ответ

ReadFile может вернуться до чтения numOfBytesRead на основе таймаута, см. SetCommTimeouts. Если вы не инициализировали настройки таймаута, вы наследуете все, что было установлено другими программами. Поэтому для последовательного поведения 1 вы должны вызвать этот API при открытии COM-порта.

  • 0
    Спасибо, похоже, что COMMTIMEOUTS.ReadIntervalTimeout был 0. Поэтому ReadFile() не возвращается, пока не будет получено numberOfBytesToRead

Ещё вопросы

Сообщество Overcoder
Наверх
Меню