当物理上断开USB端口上的串行电缆时,C#SerialPort.IsOpen返回true。 任何人都可以帮助我克服这个问题。
答案 0 :(得分:5)
不是串口工作的方式,他们没有像TCP这样的标准连接导向协议。 " IsOpen"名字选择不是偶然的,它不会说"已连接"并且只表示Open()调用成功,并且在程序退出时调用Close()方法可能是个好主意。
幸运的是,当您断开电缆或关闭设备电源时,您应该看到SerialPort.DsrHolding属性 false 。 SerialPort.CtsHolding应该表明设备已准备好接收数据。这些硬件握手信号并不总是正确实现,并且当电缆因电噪声而断开时,它们会给出错误的指示。
除此之外没有充分的理由让电缆断开连接而不是任何人都知道它,串口电缆总是很短。
答案 1 :(得分:0)
据我所知,串口没有标准的方法可以知道对方是否有什么东西。有些设备可能会拉高线指示连接,但这一切都取决于设备,这意味着您必须自己实现该逻辑。
我建议你试一试,看看你是否得到了回报。如果您启用了握手,如果另一端没有设备,您很可能会超时。
答案 2 :(得分:0)
你的问题很模糊,细节会很有帮助,但无论如何我都会尝试。
这不是IsOpen的用途。如果你想知道串口是否连接到什么东西,你将不得不使用Read和Write TimeOut属性,并在你发送的任何msg语句周围设置try catch。
我通常做的是创建一个简单的方法,在串口上向设备发送查询,然后如果它接收到某些东西则连接它。如果它超时出错了。我打开串口后立即调用此方法以确保一切正常。之后,每次尝试发送内容时都必须依赖超时异常。
检测USB电缆是否已插入串行转换器。如果转换器被拔掉,它应该从可用的端口列表中删除。如果这样做,当您尝试打开端口时,SerialPort应该抛出异常。
答案 3 :(得分:0)
如果您打开了串行端口,则IsOpen将始终返回true。 它只能告诉您是否已打开串行端口。
如果您想知道串行端口是否已物理断开连接,请尝试向设备发送命令字符串,您可以在其中获得命令的响应。 每隔5秒或10秒间隔执行一次,以密切注意设备的连接情况。
以上是我在项目中的工作方式,如果有更好的方法,请在下面评论。