VB拔掉已经打开的串口问题
VB软件打开了某个串口后正在运行,怎么实现当串口线拔掉后该打开的串口也跟着关闭。不然再插回串口线后继续发送数据的时候就会卡机,软件就会没响应了,只能重现打开软件才可以。 VB 串口通信 上位机
[解决办法]
个人认为这个问题需要换个思路,通常情况下串口通信都是一发一收的,如果连续几次通信都超时了,不就可以认为是串口线路不通了?此时关闭串口即可。
[解决办法]
串口开着总在通讯吧,检测到一段时间没通讯就把串口关掉,就像一楼说的。
也可以这样,如果是主动发送的,那就在要发送的时候去开串口,发完就关掉,
如果是被动接收的,还是去改下通讯协议,发个心跳包什么的,多长时间没通讯就关掉。
[解决办法]
Private Sub MSComm_OnComm()
Select Case MSComm1.CommEvent
Case comEventBreak ' 收到 Break。
Case comEventCDTO ' CD (RLSD) 超时。
Case comEventCTSTO ' CTS Timeout。
Case comEventDSRTO ' DSR Timeout。
Case comEventFrame ' Framing Error
Case comEventOverrun '数据丢失。
Case comEventRxParity ' Parity 错误。
Case comEventTxFull '传输缓冲区已满。
Case comEventDCB '获取 DCB] 时意外错误事件
Case comEvCD ' CD 线状态变化。
Case comEvCTS ' CTS 线状态变化。
Case comEvDSR ' DSR 线状态变化。
Case comEvRing ' Ring Indicator 变化。
Case comEvReceive ' 收到 RThreshold # of chars.
Case comEvSend ' 传输缓冲区有 Sthreshold 个字符 '
Case comEvEOF ' 输入数据流中发现 EOF 字符
End Select
End Sub
建议LZ从涉及Case comEventTxFull '传输缓冲区已满。
或者Case comEvSend ' 传输缓冲区有 Sthreshold 个字符
等OnComm事件考虑USB的COM口被拔除。
[解决办法]
Case comEventTxFull '传输缓冲区已满。似乎更能反映LZ拔除USB出现情况。或者几个线变化来考虑解决问题。这些都要实践证实。
[解决办法]
这些建议都需要实验证实,只有发送数据就与传输缓冲区有关,当然与传输缓冲区已满那事件有关。我只是建议,解决问题要靠LZ自己。
[解决办法]
你需要清理的是,对串口设备操作的层面问题。
1 所谓打开和关闭串口,实际上是对 PC 端控件的操作。只要本机该端口存在且没有打开,就可以无错误地打开串口。
2 当 PC 端发送数据时,本机硬件会改变接口上 TXD 脚的电平。无论是否真有线路连接,都不会出错。
3 当 PC 端接收数据时,如果你的代码是定长循环的,且线路断开或外部设备没有正确回应,则会停留在循环中。
因此,你的解决之道至少有两种:
1 在你的循环中加入超时处理(可以借助 Timer)。
2 如果你的架构是通过中断方式接收(而不是发送代码中的死循环接收),且通过设置公共变量标志来确定成功接收到最后发送的数据的应答。则可以在发送持续中,显示一个 Reset 按钮。如果长时间没有得到应答,按此按钮,将公共变量恢复为允许发送的状态。