我正在使用Win32 API从串行端口读取数据:
DWORD numRead = 0;
ReadFile(mPortHandle, mReceiveBuffer.get(), mReceiveBufferSize, &numRead, nullptr);
此呼叫花费的时间非常长:要精确到129毫秒(通过QueryPerformanceCounter测量)。
我用几种不同的硬件设备进行了测量:
这些设备中的每一个都会给我完全相同的延迟:129ms。因此,我认为它的硬件或驱动程序都没有问题(每个设备应该使用完全不同的驱动程序,对吧?)。
我还摆弄了超时,但这并没有改变任何东西。
还有什么呢?
答案 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毫秒内返回。