单片机的原因可以排除吧?同样的调试程序,c#百试不爽,vb怎么搞都不正常。你叫人家怎么配合你?我想知道,vb的那个控件是不是有什么属性需要设置?瞬间解决问题

解决方案 »

  1.   

    补充一点:单片机采用485串口连接,因俺的电脑没串口,故加了个USB转串口的东西。
      

  2.   

    你是不是在MSComm1_OnComm事件里检测到comEvReceive消息的时候直接去缓冲区读的数据,如果是这样那是要出问题的,因为触发comEvReceive消息的时候数据可能还没接收完成,这时候去读缓冲区就会少东西,而下次再读的时候又可能多东西,因为上次还有部分东西没读出。
    解决办法就是自己编程再建个缓冲区,在MSComm1_OnComm事件里检测到comEvReceive消息的时候把数据直接读到自建的缓冲区里面,然后根据协议对自建缓冲区的数据进行处理。
      

  3.   

    没有用到OnComm事件,协议中若果规定即时返回数据,就不要用OnComm事件。      Dim Out(9) As Byte
          Out(0) = &H55
          Out(1) = &HEE
          Out(2) = &H50
          Out(3) = &H33
          Out(8) = &HC6
          '//Send code:55 EE 50 33 0 0 0 0 C6
          Comm.Output = Out
          Sleep 500
          If Comm.InBufferCount < 5 Then Exit Sub    '//实际字节数应为9,考虑到调试时可能收不完
          Dim DataBuff As Variant
          Dim DTcount As Integer
          DoEvents
          DTcount = Comm.InBufferCount
          DataBuff = Comm.Input
      

  4.   

    LZ的接收应该放在OnComm事件中完成,设置好MsComm控件的RThreshold 属性为9,可以完整接收和处理数据的。
      

  5.   

    把 Sleep 什么的都去掉,Do Until Comm.InBufferCount = 9
        DoEvents
    Loop当然,你还可以加上超时处理。
      

  6.   

    试了下,用OnComm事件没能解决问题,而且这个事件效率太低,我不喜欢用。楼上童鞋的办法也没效果,毕竟C#程序也用Threading.Sleep就可以,而其它产品的通信,俺用Sleep这个API,可说百试不爽。
      

  7.   

    事件效率还低,那你还是继续sleep吧,不过sleep 500恐怕不够,试试sleep 10000,你这点数据量sleep 10000的话应该够,MSCOMM控件神马的也没必要了,直接API吧,ReadFile WriteFile操作串口应该更适合你。
      

  8.   

    起始俺提这个问题的原意是找出MScomm控件解决这种乱码的办法,在VB6里面俺用这个控件十多年了,没有一次不能满足要求。本来打算用最优雅的办法解决,不去考虑什么C#、VC写什么Dll,烦人!
    可惜搞了半天没个头绪,俺只好用串口API解决了,反正通信协议不是很复杂。至于Comm_OnComm事件,很多时候蛮好用,但不该用到它时最好不要纠结,阿拉吃过这种亏的。