通过ReadFile从串口读取非常慢

问题描述 投票:0回答:2

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

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

此调用需要很长时间:129ms是准确的(通过QueryPerformanceCounter测量)。

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

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

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

我也摆弄了超时,但这并没有改变任何事情。

还有什么呢?

winapi serial-port readfile
2个回答
0
投票

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

接收缓冲区大小是否大?

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


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在1ms内返回。

© www.soinside.com 2019 - 2024. All rights reserved.