本人VB新人有个获取外部设备数据的串口程序,获取数据有些问题请教各位大侠。
  通信协议中发送410命令到外部设备获取到数据包
  数据包格式为  16进制

解决方案 »

  1.   

    窗体载入定义代码:
         MSComm1.CommPort = 1
        MSComm1.Settings = "9600,N,8,1"
        MSComm1.InputMode = comInputModeBinary
        MSComm1.InputLen = 0
        MSComm1.RThreshold = 1
        'MSComm1.EOFEnable = True
        If MSComm1.PortOpen = False Then
            MSComm1.PortOpen = True
            MSComm1.Output = "410"
        End IfPrivate Sub MSComm1_OnComm()
        sdata = ""
        i = MSComm1.InBufferCount
        If i > 110 Then
            
            Dim strdatablock() As Byte
            Dim s As String
            Dim b As Boolean
            b = False
            If i > 0 Then
                    strdatablock = MSComm1.Input
                    i = MSComm1.InBufferCount
                    If MSComm1.PortOpen = True Then
                        MSComm1.PortOpen = False
                    End If
                     
                    For i = 0 To UBound(strdatablock)
                        If CStr(strdatablock(i)) = "2" Then
                            b = True
                        End If
                        If b = True Then
                            s = s & " " & CStr(strdatablock(i))
                        End If
                    Next i
                    sdata = sdata + s
                    End If
            '判定数据有更新
            If Len(sdata) > 0 Then
                '调用数据分析函数将获得的数据赋值给相应的变量
                strTranslation (sdata)
            End If
        End If
    End Sub现在遇到的问题是 获取到的数据不合理有时候数据包很完整,有时候只有后面一部分,有时候只有前面的一部分,格式中那些关键的02,03,04不一定都能获取到,我使用网上的串口调试助手每次发送都能给我返回完整的数据包,我想肯定是我哪里没有注意到所以才会获取数据不合理,在此请教各位大侠了。。
      

  2.   

    http://download.csdn.net/detail/veron_04/1262066
      

  3.   

    http://download.csdn.net/detail/veron_04/1262066
      

  4.   

    谢谢,各位大虾,问题原因我找到了,长度不固定的包有110来判定不合适,用查找包尾标志04 来判定包结束才合理。
    我还有个疑问,在我发送一个数据包请求后,单步调试中我看到外设每次返回的数据包input中数据有时只有前面一半,有时只有后面一半,有时候正好一个数据包,这种情况是为什么呢?
    照理发过来的包应该是一样的啊?
    希望大虾们指点迷津。。
      

  5.   


    Option Explicit
    Private Declare Function GetTickCount Lib "kernel32" () As Long
    Private Sub Command1_Click()
        Dim lngP As Long
        Dim bytA() As Byte      '存储发送内容
        Dim varP As Variant     '
        Dim bytIn(100) As Byte  '存储输入内容
        Dim intP As Integer
        '发送命令
        '以二进制方式发送数据,请先填写bytA,我不清楚你的通信协议,所以无法给出定论
        '打个比方,你要发送410过去,那么就是:
        ReDim bytA(0 To 2) As Byte
        bytA(0) = &H34 '4的ASCII码
        bytA(1) = &H31
        bytA(2) = &H30
        intP = 0
        MSComm1.InBufferCount = 0
        MSComm1.Output = bytA
        lngP = GetTickCount
        Do
            varP = MSComm1.Input
            bytIn(intP) = varP(0)
        Loop Until (GetTickCount - lngP) > 100 Or varP(0) = &H4
        
    End SubPrivate Sub Form_Load()
        MSComm1.CommPort = 1
        MSComm1.Settings = "9600,N,8,1"
        MSComm1.InputMode = comInputModeBinary
        MSComm1.InputLen = 1
        MSComm1.RThreshold = 0      '这个至关重要
        'MSComm1.EOFEnable = True
        If MSComm1.PortOpen = False Then
            MSComm1.PortOpen = True
    '        MSComm1.Output = "410"
        End If
    End Sub