【问题标题】:Timeouts in C# serial portC# 串口超时
【发布时间】:2013-02-13 21:53:28
【问题描述】:
我正在使用C# 串行端口库与传感器和 PC 进行通信。
即使那里有数据,我也经常使用SerialPort.Read() 方法超时。我使用串行嗅探器检查我是否在端口接收到所有数据包,但有些 .NET 没有选择所有数据包并超时。我正在读取字节,我收到的字节比串行端口缓冲区大小小 2112。我尝试了多种方法,现在考虑使用本机 C/C++ 并在 C# 中调用它。有人可以分享更多想法或在C#中使用原生C/C++代码。
【问题讨论】:
标签:
c#
c
visual-c++
timeout
serial-port
【解决方案1】:
以 460800 到 921600 的波特率运行
那些是相当奇怪的波特率,相当高。显然,您没有使用 DataReceived 事件,因此调用 Read() 方法的频率变得相当关键。花一些时间做其他事情,包括 Windows 认为需要完成更重要的事情和上下文切换离开你的线程,接收缓冲区将很快溢出。未实现 SerialPort.ErrorReceived 事件是一个标准错误,因此您只是看不到那些溢出,您所看到的只是缺少数据。
用 C++ 编写这段代码不太可能带来缓解。串口只有一个 api,SerialPort 只是一个瘦包装器,它使用 winapi 函数,就像你的 C++ 代码一样。
所以采取以下所有步骤:
- 实现 ErrorReceived 事件,以便您知道发生溢出
- 倾向于使用 DataReceived 事件,这样您就不必过于频繁地调用 Read()
- 将 ReadBufferSize 设置为一个不错的大数字,这样驱动程序就可以填补空缺
- 设置 Handshake 属性,以便驱动程序可以告诉设备在缓冲区已满时停止发送
- 检查您是否可以实施协议,以便设备不只是对机器进行消防栓
- 如果仍然不够可靠,请降低波特率。