C#串口超时

时间:2013-02-13 21:53:28

标签: c# c visual-c++ timeout serial-port

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

1 个答案:

答案 0 :(得分:1)

  

以波特率460800至921600

运行

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

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

所以请采取以下所有步骤:

  • 实施ErrorReceived事件,以便知道发生溢出
  • 赞成使用DataReceived事件,因此您不依赖于经常调用Read()
  • 将ReadBufferSize设置为一个很好的大数字,以便驱动程序可以解决这个问题
  • 设置Handshake属性,以便驱动程序可以告诉设备在缓冲区已满时停止发送
  • 检查您是否可以实施协议,以便设备不仅可以对机器进行灭火
  • 如果波特率仍不够可靠,则降低波特率。