问题描述
在串行通信中,ReadFile
直到读取了 sizeToRead
参数后才返回.
In serial communication, ReadFile
doesn't return until reading as many as sizeToRead
parameter.
这太奇怪了,因为实际上直到昨天,它仍然可以使用相同的代码、相同的笔记本电脑正常工作,虽然它没有接收到 sizeToRead
那么多但返回任何字节.
It is so weird, because actually until yesterday, it works normally with same code, same laptop, returning though it doesn't receive as many as sizeToRead
but any bytes.
但今天我的代码显示出这样的奇怪症状.
But today my code show weird symptom like this.
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 字节后返回
numberOfBytesToRead is 256, So ReadFile return after getting 256 bytes
推荐答案
ReadFile 可以根据超时在读取 numOfBytesRead 之前返回,请参阅 SetCommTimeouts.如果您尚未初始化超时设置,那么您将继承其他程序设置的任何内容.因此,为了保持一致的行为 1,您应该在打开 COM 端口时调用此 API.
ReadFile can return before reading numOfBytesRead based on a timeout, see SetCommTimeouts. If you have not initialized the timeout settings then you inherit whatever was set by other programs. So for consistent behavior 1you should call this API when you open the COM port.
这篇关于windows ReadFile() 在读取 sizeToRead 值之前不会返回的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!