【发布时间】:2016-01-23 06:03:22
【问题描述】:
在串行通信中,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 必须返回,但现在它似乎等待接收 256 个字节,但任何字节。跨度>
-
不,当您在串行端口上使用 ReadFile() 时,它不是这样工作的。您唯一的保证是它至少返回 1 个字节。您不能忽略您的 numOfBytesRead 变量,您将获得驱动程序接收缓冲区中可用的任何内容。或者ReadFile()返回值,never忽略失败返回。
标签: c++ c windows serial-port