解决方案 »

  1.   

    通讯线被拔掉,不应该出异常,最多就是数据发不出去,也没有数据返回了而已
    如果你的串口是USB转串口,USB被拔掉了才会出问题
      

  2.   

    大牛,如果是正在接收报文的时候,线被拔掉了呢?
    你应该知道,串口是一个字节一个字节发送,也是一个字节一个字节接收的,不存在所谓数据包的概念
    正接收一半的时候线路断了,后面的字节就收不到了呗,不会报任何系统错误,最多你最后校验数据的时候判断数据有错误等线路恢复了,你再继续发送数据,接收数据,没有任何影响问题是如果是USB口设备,拔掉了USB口,那么设备就找不到了,你再插上也没用
      

  3.   

    比如USB驱动里将串口虚拟成COM3
    那么一开始USB是插好的,你打开COM3,发,收,都没有问题这时如果拔掉了USB口,COM3就不存在了,这时你即使执行关闭COM3的指令也会出问题,没法避免的
      

  4.   

    而不管你使用vs里封装的SerialPort还是调用windows的api
    都是用一个引用类型的变量引用串口对象
    串口对象不存在了之后,这个引用类型的变量就指向null了
    这时即使重新插上USB口设备,引用类型的对象也不会自动指向新插入的设备
    而即使你重新new了对象指向COM3,原来的对象其实并没有释放,还处于open的状态,执行close也会出错,因为是null,不能close
      

  5.   

    不用serialport类,用mscomm32或者串口芯片的api
    我上次用serialport,留着也不对,关掉也不对,芯片的api也不全,折腾死我了
      

  6.   

    正常串口即使拔下来,串口也还在,只不过是接收而已
    usb转的,拔下来串口号就没了,发也不是,关串口也不是。不关串口吧,再插上了还是这个串口号,冲突,蛋疼菊紧
      

  7.   

    一般情况下USB串口拨掉再重新插上后的COM号是不变的,拨掉后SerialPort会抛异常,这时可以通过这个异常来触发端口检测,用来尝试打开COM口
      

  8.   

    一般情况下USB串口拨掉再重新插上后的COM号是不变的,拨掉后SerialPort会抛异常,这时可以通过这个异常来触发端口检测,用来尝试打开COM口
      

  9.   

    COM号有时候确实不变,那是你把USB设备插回同一个USB口的情况,如果插到另外的口,就变了
    而且拔下USB设备并不会抛异常,如果你使用的是回调函数的话
    除非拔下USB设备后,又对设备进行操作了,比如OPEN,CLOSE这时才会出异常