我正在使用Win32 API从串口读取数据:
DWORD numRead = 0;
ReadFile(mPortHandle, mReceiveBuffer.get(), mReceiveBufferSize, &numRead, nullptr);
此调用需要很长时间:129ms是准确的(通过QueryPerformanceCounter测量)。
我用几种不同的硬件设备进行了测量:
这些设备中的每一个都给出了完全相同的延迟:129 ms。因此我不认为它的硬件或驱动程序的错误(每个设备应该使用完全不同的驱动程序,对吧?)。
我也摆弄了超时,但这并没有改变任何事情。
还有什么呢?
也许是因为你总是通过指定接收缓冲区的总大小来读取文件。
接收缓冲区大小是否大?
如果为DataReceived事件注册事件处理程序并且只读取到达设备驱动程序缓冲区的数据,则会减少额外的等待时间。
好的,问题解决了:-)
到现在为止我设置了这样的超时:
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内返回。