我通过电脑COM1口和某设备连接,电脑发送控制字,然后设备进行反馈。
但是电脑的串口一直处于打开状态时(一直有控制字发送),如果下面的设备电源有开关,那么关闭设备,在打开设备时电脑程序会假死,就像进入了死循环一样,而把设备关上,程序就又好了。如果先开设备,再打开电脑程序连接时没有什么问题。但是这样先开设备再连接用起来不好,因为设备是要频繁开断电的。最后我确认出是一条语句出了问题,是在ONCOMM事件中的这句:chr1=mscomm1.input,这句死掉了,这就不太好理解了,就算开断电时串口寄存器里会有些莫名其妙的东西,怎么可能死掉呢?再说我也不可能做到在设备开电的一小段时间内不发送数据,因为好象没办法判断串口的另外一方是否有电吧。
如果有判断串口连接是否正常的办法(有电无电),谁能提供一下说明呢,谢谢,快要交差了,在线等!!

解决方案 »

  1.   

    if MSComm1.CommEvent=comEvReceive then
       chr1=mscomm1.input
    end if
      

  2.   

    能否看看你的相关代码?现在只好猜了。试试,把 chr1=mscomm1.input 这句前加上:
    If mscomm1.InBufferCount = 0 then exit sub
      

  3.   

    同志们,革命还未成功啊,还是不行。好象在接受时死程序buffercount也不为0啊,都是乱码。二楼给的办法也试过的,也还是死哟。还请大家继续提供办法,谢谢。
      

  4.   


            If comm1.InBufferCount = 1 Then
                Debug.Print comm1.InBufferCount & "==0000"
                chr2 = comm1.Input          '就是这句
                comm1.InBufferCount = 0
            Else
                Exit Sub
            End If
            
            Debug.Print comm1.InBufferSize & ";;;;"
      

  5.   

    这个问题我解决了,我设置了一个历史COM1时间状态数组,每发生一次ONCOMM事件,就读取事件码然后作为队列存入这个数组,直到这个数组里值全都为comEvReceive 时,然后再开始读寄存器,这样就简单实现了,断电后再开点的一个短暂的延时,同时也避免了 由于读入非法数据造成的程序假死,嘿嘿,以后各位碰到这样的问题可以参考一下,虽然损失点时间,但是能够正常运行就是好的。
      

  6.   

    我用的ONCOMM事件,使用DoEvents方法,没遇到死机的情况