C#串行端口超时

本文关键字:超时 串行端口 | 更新日期: 2023-09-27 17:59:07

我使用C#串行端口库与传感器和PC进行通信。我经常使用SerialPort.Read()方法超时,即使其中有数据。我使用串行嗅探器来检查我是否在端口上接收到了所有的数据包,但有些是如何接收的。NET并没有选择所有这些,并超时。我正在读取字节,接收到的字节比串行端口缓冲区大小小2112。我尝试了多种方法,现在考虑使用本机C/C++并在C#中调用它。有人能分享更多想法或在C#中使用本机C/C++代码吗。

C#串行端口超时

以460800至921600 的波特率运行

这是非常奇怪的波特率,相当高。很明显,您没有使用DataReceived事件,因此调用Read()方法的频率变得相当关键。休息一段时间做其他事情,包括Windows认为需要做一些更重要的事情,上下文从线程切换开,接收缓冲区会很快溢出。未实现SerialPort。ErrorReceived事件是一个标准错误,所以您不会看到这些溢出,您看到的只是缺少数据。

用C++编写这段代码不太可能带来缓解。串行端口只有一个api,SerialPort只是一个瘦包装器,它像C++代码一样使用winapi函数。

因此,采取以下所有步骤:

  • 实现ErrorReceived事件,以便知道发生了溢出
  • 倾向于使用DataReceived事件,这样就不需要频繁调用Read()
  • 将ReadBufferSize设置为一个非常大的数字,这样驱动程序就可以占用空闲时间
  • 设置Handshake属性,以便驱动程序可以在缓冲区已满时通知设备停止发送
  • 检查你是否可以执行一个协议,这样设备就不会只是给机器灭火
  • 如果波特率仍然不够可靠,请降低波特率