【发布时间】: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