【问题标题】:SerialPort - Clear Existing DataSerialPort - 清除现有数据
【发布时间】:2015-04-16 22:46:48
【问题描述】:

我正在使用 .NET SerialPort 类与仪表进行通信。每次按下仪表上的按钮时,都会通过端口发送读数值。

我遇到的问题是,如果在程序关闭时按下仪表按钮,那么当程序启动时,它会触发该现有数据的数据接收事件。我不想要这种行为——我只想在端口打开后收集读数。

我目前有一个使用 Thread.Sleep 的解决方法,但它看起来很老套,我想知道是否有人知道更好的解决方案。

port = New SerialPort("COM1", 9600, Parity.None, 8, StopBits.One)

port.Open()
port.DtrEnable = True

System.Threading.Thread.Sleep(100)
port.ReadExisting()

AddHandler port.DataReceived, AddressOf PortDataReceived

如果我没有 Thread.Sleep,则会为之前的仪表数据触发 DataReceived 事件。我猜这是因为 ReadExisting 没有阻塞,所以当它在打开后立即调用时,它什么也不读取。

谢谢


因此,如果您在打开其零后立即调用“port.BytesToRead()”。如果您在打开其非零后 100 毫秒调用它。我想这是有道理的——打开后读取现有数据需要一些时间。

另一个选项是调用 read 并设置读取超时,但这似乎与 Thread.Sleep 没有什么不同,除非你必须捕获异常......

【问题讨论】:

  • 你是在使用 Xon/Xoff 还是硬件握手
  • 我正在使用 .NET 中 SerialPort 类的默认值。我会试着弄清楚那是什么:)
  • 如果没有通信,您的串行设备是否也会缓冲按钮按下并重新发送?

标签: .net vb.net serial-port


【解决方案1】:
 port.DtrEnable = True

这可能会产生副作用。仪表可能会上下跳跃,急于发送读数。毕竟,有人按下按钮告诉它可以发送。但是它的传输程序正在观察握手协议,数据终端就绪没有打开。跳啊跳啊!它开启了。发送。这需要一段时间,取决于波特率。

那么,为什么有人在计算机还没有准备好的情况下按下按钮?为什么它没有总是准备好?回答这个问题,然后你可以删除 Sleep()。还要找出当有人在计算机准备好之前按下按钮一百次时会发生什么。您的 Sleep() 可能太短了。

【讨论】:

  • 我不是串口出口​​。开启 DTR 会导致在打开时向设备发送命令吗?如果是这样,那是完全有道理的。 (如果没有那条线,我永远不会收到数据)。多次按下它似乎没有什么区别——它只存储 1 个结果,直到它被读取。所以关闭,按 10 次,打开,我从仪表中读取 1 条消息。至少这个特定的规格:)
  • 回答第二部分(为什么在没有程序打开的情况下按下按钮)——我只是想处理无意的使用。它是一个仪表校准日志程序,因此他们启动它以记录值。我只是想确保没有混淆——他们启动程序并没有看到已经输入的值。
  • 嗯,没关系,没有人会特别注意 100 毫秒。当您的程序在启动后显示读数时,他们也不会抱怨,即使从那时起就没有按下按钮。这不可能是一个真正的问题。教育你的用户,他们会说“啊,有道理”。
【解决方案2】:

如果您不需要收集在串行端口的输出缓冲区中等待的内容,请尝试调用 serialPort.DiscardWriteBuffer() serialPort.DiscardOutBuffer() 来清除那里收集的任何内容。感谢 Chad 纠正我的错误。

【讨论】:

  • 不是serialPort.DiscardOutBuffer()吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 2019-09-30
  • 2011-11-04
  • 2017-09-23
  • 1970-01-01
相关资源
最近更新 更多