与设备通信中,每次收到的数据包长度不固定,
关键的是,数据中会有一些不需要的数据,需要的只是以帧头开始,获取帧长的一串数据
有效数据格式规则:
帧头EE  帧长 00 0A (就是不含帧头10个字节) XX XX XX XX XX XX XX XX我现在在初始化的时候  comLocal.RThreshold = 1但是在oncomm事件里
    Select Case comLocal.CommEvent
        Case comEvReceive   '接受字符事件   //事件值为2表示接收缓冲区内有字符                            
            If comLocal.InBufferCount > 0 Then
                Label1.Caption = comLocal.InBufferCount
                comLocal.RThreshold = 0    '关闭接收
                   SCOM_FirstRev = comLocal.Input           
                 sBuffstring = ParaDecode(SCOM_FirstRev, True)    ‘转换16进制
                 Text1.Text = Text1.Text & "—>(" & Label1.Caption & ")" & sBuffstring & vbCrLf
                 comLocal.RThreshold = 1    '开启接收这个时候我会收到长度不一的字符串,都不固定
可能是
—>(1)00 
—>(16)00 00 22 8B 99 D9 AD C4 11 CA 33 C6 66 67 B6 F4 
—>(8)43 4F 4E 46 49 47 20 46 
—>(13)50 47 41 20 53 55 43 43 45 53 53 20 20 
—>(8)EE 00 09 0A FF 01 04 01 
—>(4)01 00 12 48 
也可能是—>(1)00 
—>(16)00 00 22 8B 99 D9 AD C4 11 CA 33 C6 66 67 B6 F4 
—>(8)43 4F 4E 46 49 47 20 46 
—>(12)50 47 41 20 53 55 43 43 45 53 53 20 
—>(9)20 EE 00 09 0A FF 01 04 01 
—>(4)01 00 12 48 请问如何解决这个读取问题啊,还要考虑在高速运行的情况下不出问题,现在焦头烂额。

解决方案 »

  1.   

    通讯协议里面是如何规定下位机返回的数组长度的?如果是16那么加入代码SCOM_FirstRev = comLocal.Input
    if Ubound(SCOM_FirstRev)-Lbound(SCOM_FirstRev)<>16 then
        exit sub
    end if
    不知道对不对
      

  2.   

    定义一个全局的Collection对象或动态数组,在Mscomm的OnComm事件里面不管收到什么都保存到这个全局Collection对象或动态数组里,然后用个定时器去检查全局Collection对象或动态数组里是否有数据,如果有数据再判断第一个是不是帧头,如果不是就从Collection对象或动态数组里删除后再继续检查下一个,如果是帧头再从后面取得帧长度,再根据帧长度取出完整的数据帧。用Collection对象应该会比用动态数组方便一些,你可以研究研究。