В последовательной связи 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 байтов
ReadFile может вернуться до чтения numOfBytesRead на основе таймаута, см. SetCommTimeouts. Если вы не инициализировали настройки таймаута, вы наследуете все, что было установлено другими программами. Поэтому для последовательного поведения 1 вы должны вызвать этот API при открытии COM-порта.
COMMTIMEOUTS.ReadIntervalTimeout
был 0. Поэтому ReadFile()
не возвращается, пока не будет получено numberOfBytesToRead