通过ReadFile从串行端口读取非常慢

时间:2019-02-18 13:45:21

标签: winapi serial-port readfile

我正在使用Win32 API从串行端口读取数据:

DWORD numRead = 0;
ReadFile(mPortHandle, mReceiveBuffer.get(), mReceiveBufferSize, &numRead, nullptr);

此呼叫花费的时间非常长:要精确到129毫秒(通过QueryPerformanceCounter测量)。

我用几种不同的硬件设备进行了测量:

  • 带有FTDI芯片组的USB适配器
  • 带有多芯片组的USB适配器
  • PCI Express RS232卡
  • 主板的板载串口

这些设备中的每一个都会给我完全相同的延迟:129ms。因此,我认为它的硬件或驱动程序都没有问题(每个设备应该使用完全不同的驱动程序,对吧?)。

我还摆弄了超时,但这并没有改变任何东西。

还有什么呢?

2 个答案:

答案 0 :(得分:0)

也许是因为您总是通过指定接收缓冲区的总大小来读取文件。

接收缓冲区大小是否很大?

如果为DataReceived事件注册一个事件处理程序,并且仅读取到达设备驱动程序缓冲区中的数据,则将减少额外的等待时间。

答案 1 :(得分:0)

好的,问题解决了:-)

直到现在,我都将超时设置为:

COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = 1;
timeouts.ReadTotalTimeoutMultiplier = 1;
timeouts.ReadTotalTimeoutConstant = 1;
timeouts.WriteTotalTimeoutMultiplier = 1;
timeouts.WriteTotalTimeoutConstant = 1;

不起作用。如果我只设置常量,则可以:

COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = 0;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 1;
timeouts.WriteTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 0;

现在ReadFile在1毫秒内返回。