【问题标题】:windows ReadFile() doesn't return until reading sizeToRead valuewindows ReadFile() 在读取 sizeToRead 值之前不会返回
【发布时间】: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


【解决方案1】:

ReadFile 可以根据超时在读取 numOfBytesRead 之前返回,请参阅 SetCommTimeouts。如果您尚未初始化超时设置,那么您将继承其他程序设置的任何内容。因此,为了获得一致的行为 1,您应该在打开 COM 端口时调用此 API。

【讨论】:

  • 谢谢,COMMTIMEOUTS.ReadIntervalTimeout 似乎是 0。这就是为什么 ReadFile() 在收到 numberOfBytesToRead 之前不会返回
猜你喜欢
  • 1970-01-01
  • 2019-06-03
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多