2013-02-13 134 views
0

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

回答

1

运行在波特率460800到921600

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

用C++编写这段代码是不太可能缓解的。串口只有一个API,SerialPort只是一个简单的包装器,并且使用winapi函数就像C++代码一样。

因此,采取一切步骤如下:

  • 落实ErrorReceived事件,这样你知道是溢出,所以你不依赖于调用read(使用DataReceived事件检索发生
  • 青睐)频繁足够的
  • 设置ReadBufferSize为一个很大的数字,以便驱动程序可以占用松弛
  • 设置Handshake属性,以便驱动程序可以告诉设备在缓冲区已满时停止发送
  • 检查您是否可以实施协议,以便设备不会消耗机器的热量
  • 如果波特率仍然不够可靠,请降低波特率。