首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VB拔掉已经打开的串口有关问题

2013-11-09 
VB拔掉已经打开的串口问题VB软件打开了某个串口后正在运行,怎么实现当串口线拔掉后该打开的串口也跟着关闭

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口被拔除。
[解决办法]
引用:
建议LZ从涉及Case comEventTxFull   '传输缓冲区已满。
或者Case comEvSend   ' 传输缓冲区有 Sthreshold 个字符
等OnComm事件考虑USB的COM口被拔除。


Case comEventTxFull   '传输缓冲区已满。似乎更能反映LZ拔除USB出现情况。或者几个线变化来考虑解决问题。这些都要实践证实。
[解决办法]
引用:
我的程序只有发送事件,不接收任何数据的,所以OnComm不行吧


这些建议都需要实验证实,只有发送数据就与传输缓冲区有关,当然与传输缓冲区已满那事件有关。我只是建议,解决问题要靠LZ自己。
[解决办法]
你需要清理的是,对串口设备操作的层面问题。

1 所谓打开和关闭串口,实际上是对 PC 端控件的操作。只要本机该端口存在且没有打开,就可以无错误地打开串口。

2 当 PC 端发送数据时,本机硬件会改变接口上 TXD 脚的电平。无论是否真有线路连接,都不会出错。

3 当 PC 端接收数据时,如果你的代码是定长循环的,且线路断开或外部设备没有正确回应,则会停留在循环中。

因此,你的解决之道至少有两种:

1 在你的循环中加入超时处理(可以借助 Timer)。

2 如果你的架构是通过中断方式接收(而不是发送代码中的死循环接收),且通过设置公共变量标志来确定成功接收到最后发送的数据的应答。则可以在发送持续中,显示一个 Reset 按钮。如果长时间没有得到应答,按此按钮,将公共变量恢复为允许发送的状态。

热点排行