【问题标题】: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 属性,以便驱动程序可以告诉设备在缓冲区已满时停止发送
    • 检查您是否可以实施协议,以便设备不只是对机器进行消防栓
    • 如果仍然不够可靠,请降低波特率。

    【讨论】:

      猜你喜欢
      • 2016-10-01
      • 2014-10-16
      • 2012-01-16
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多