0

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

4

1 回答 1

1

以 460800 到 921600 的波特率运行

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

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

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

  • 实现 ErrorReceived 事件,以便您知道发生溢出
  • 喜欢使用 DataReceived 事件,这样您就不必依赖于调用 Read() 足够频繁
  • 将 ReadBufferSize 设置为一个不错的大数字,以便驱动程序可以占用空间
  • 设置 Handshake 属性,以便驱动程序可以告诉设备在缓冲区已满时停止发送
  • 检查您是否可以实施协议,以便设备不只是给机器喷水
  • 如果仍然不够可靠,请降低波特率。
于 2013-02-13T22:13:39.713 回答