串行通信延迟最小

我有一台通过串行通讯(即物理或模拟串行端口的RS-232 / RS-422)与外部设备连接的计算机。 它们通过频繁的数据交换(30Hz)相互通信,但只有小数据包(每个包less于16个字节)。

通信的最关键的要求是发送和接收之间的低延迟或延迟。

数据交换模式是握手式的。 一个主机设备发起通信,并持续在客户端设备上发送通知。 客户端设备需要尽可能快地回复来自主机设备的每个通知(这正是需要实现低延迟的地方)。 通知和回复的数据包已经定义好了; 即数据长度是已知的。 基本上数据丢失是不允许的。

我已经使用以下常见的Win API函数来以同步的方式执行I / O读取/写入:CreateFile,ReadFile,WriteFile

客户端设备使用ReadFile从主机设备读取数据。 一旦客户端读取长度已知的完整数据包,它将使用WriteFile向主机设备回复相应的数据包。 读取和写入总是连续的,没有并发性。

不知何故沟通不够快。 即数据发送和接收之间的时间间隔太长。 我想这可能是串口缓冲或中断的问题。

在这里我总结一些可能的行动来改善延误。 请给我一些build议和更正:)

  1. 用FILE_FLAG_NO_BUFFERING标志调用CreateFile? 我不确定这个标志在这方面是否相关。
  2. 在每个WriteFile之后调用FlushFileBuffers? 或者可以通知/中断串口立即传输数据的任何动作?
  3. 为处理串行通信的线程和进程设置更高的优先级
  4. 为模拟设备(使用其驱动程序)设置延迟计时器或传输大小。 但物理串行端口怎么样?
  5. Windows上的任何等效的东西,如Linux下的setserial / low_latency?
  6. 禁用FIFO?

提前致谢!

我遇到过与串口类似的问题。 在我的情况下,我解决了减少串行端口延迟的问题。 您可以使用控制面板更改每个端口的延迟(默认设置为16毫秒)。 你可以在这里找到这个方法: http : //www.chipkin.com/reducing-latency-on-com-ports/

祝你好运!!!