在下最近在搞com 串口通讯,现在遇到一个棘手问题:
正在和com口正常通信的情况下,com口的通讯线被拔掉了,然后就出现异常。
请教牛人如何处理这种异常,当通讯线重新插好后如何恢复正常通讯。
—- 5分
出现异常后弄个定时器,隔一段时间通讯一次看是否已连接上
—- 5分
通讯线被拔掉,不应该出异常,最多就是数据发不出去,也没有数据返回了而已
如果你的串口是USB转串口,USB被拔掉了才会出问题
如果你的串口是USB转串口,USB被拔掉了才会出问题
—- 5分
发送出去的信息要收到返回信息才行,如果没有收到返回的消息那么重发
—- 5分
说的很正确!
—-
大牛,如果是正在接收报文的时候,线被拔掉了呢?
—- 20分
你应该知道,串口是一个字节一个字节发送,也是一个字节一个字节接收的,不存在所谓数据包的概念
正接收一半的时候线路断了,后面的字节就收不到了呗,不会报任何系统错误,最多你最后校验数据的时候判断数据有错误
等线路恢复了,你再继续发送数据,接收数据,没有任何影响
问题是如果是USB口设备,拔掉了USB口,那么设备就找不到了,你再插上也没用
—- 5分
比如USB驱动里将串口虚拟成COM3
那么一开始USB是插好的,你打开COM3,发,收,都没有问题
那么一开始USB是插好的,你打开COM3,发,收,都没有问题
这时如果拔掉了USB口,COM3就不存在了,这时你即使执行关闭COM3的指令也会出问题,没法避免的
—- 10分
而不管你使用vs里封装的SerialPort还是调用windows的api
都是用一个引用类型的变量引用串口对象
串口对象不存在了之后,这个引用类型的变量就指向null了
这时即使重新插上USB口设备,引用类型的对象也不会自动指向新插入的设备
而即使你重新new了对象指向COM3,原来的对象其实并没有释放,还处于open的状态,执行close也会出错,因为是null,不能close
都是用一个引用类型的变量引用串口对象
串口对象不存在了之后,这个引用类型的变量就指向null了
这时即使重新插上USB口设备,引用类型的对象也不会自动指向新插入的设备
而即使你重新new了对象指向COM3,原来的对象其实并没有释放,还处于open的状态,执行close也会出错,因为是null,不能close
—- 5分
无外乎读写地方加try/catch
—- 5分
不用serialport类,用mscomm32或者串口芯片的api
我上次用serialport,留着也不对,关掉也不对,芯片的api也不全,折腾死我了
我上次用serialport,留着也不对,关掉也不对,芯片的api也不全,折腾死我了
—- 5分
哦,我说的是usb转的串口…
—- 5分
正常串口即使拔下来,串口也还在,只不过是接收而已
usb转的,拔下来串口号就没了,发也不是,关串口也不是。不关串口吧,再插上了还是这个串口号,冲突,蛋疼菊紧
usb转的,拔下来串口号就没了,发也不是,关串口也不是。不关串口吧,再插上了还是这个串口号,冲突,蛋疼菊紧
—- 5分
一般情况下USB串口拨掉再重新插上后的COM号是不变的,拨掉后SerialPort会抛异常,这时可以通过这个异常来触发端口检测,用来尝试打开COM口
—- 10分
一般情况下USB串口拨掉再重新插上后的COM号是不变的,拨掉后SerialPort会抛异常,这时可以通过这个异常来触发端口检测,用来尝试打开COM口
—- 10分
一般情况下USB串口拨掉再重新插上后的COM号是不变的,拨掉后SerialPort会抛异常,这时可以通过这个异常来触发端口检测,用来尝试打开COM口
COM号有时候确实不变,那是你把USB设备插回同一个USB口的情况,如果插到另外的口,就变了
而且拔下USB设备并不会抛异常,如果你使用的是回调函数的话
除非拔下USB设备后,又对设备进行操作了,比如OPEN,CLOSE这时才会出异常
CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明串口通讯线重新插好后如何恢复正常通讯!