这是论坛朋友帮我弄得一个接收数据的程序,现在可以接收数据了,但是不会把我需要的内容从数据中提取出来,希望帮忙能提取出数据并且显示在对应的文本框里。
接收数据的格式:
ldi temp , $A5 ;帧头
ldi temp , $09 ;09年日
ldi temp , $03 ;03月。。
ldi temp , $06 ;06日  。。期
ldi temp , $11 ;11时时
ldi temp , $20 ;20分
ldi temp , $35 ;35秒间
ldi temp , $12 ;1234号。。主机好
ldi temp , $34
ldi temp , $EE ;预留
ldi temp , $EE ;预留
ldi temp , $05 ;502KPa。。500风压值
ldi temp , $02
ldi temp , $06 ;603KPa。。600风压值
ldi temp , $03
ldi temp , $07 ;秒     。。上网时间
ldi temp , $01 ;TCU状态。。TCU状态(11代表A上网B正常,10B上网A正常,01A上B异常,00B上A异常)
ldi temp , $01 ;工作电流。。工作电流
ldi temp , $50
ldi temp , $01 ;排风电流。。排风电流
ldi temp , $25
ldi temp , $01 ;排风时间。。排风时间
ldi temp , $82
ldi temp , $EE ;预留
ldi temp , $EE ;预留
ldi temp , $EE ;预留
ldi temp , $EE ;预留
ldi temp , $04 ;500KPa2。。500风压值(因为使用两个传感器,所以要有两组风压值)
ldi temp , $98
ldi temp , $05 ;600KPa2。。600分压值
ldi temp , $92
ldi temp , $00 ;检测结果高
ldi temp , $00 ;检测结果低
;校验和
校验和判断时将从帧头到校验和字节在内的所有字节不带进位相加(即取最低字节)
判断结果是否为零,为零则数据传输正确,非零则异常舍弃本次所接数据继续接收。产生校验字节的方法,将从帧头到校验和字节在内的所有字节不带进位相加(即取最低字节)的结果去反加1
我需要的信息是:日期,时间,主机编号,上网时间,工作电流,排风电流,排风时间,TCU状态A状态、B状态,500风压值,600风压值,检测结果
这是接收的程序,希望高手帮帮看看接收到数据后怎么进行提取保存,谢谢!
Option Explicit
    Dim strData As StringPrivate Sub Command2_Click()
Dim sql As String
sql = "select * from 数据 "
Adodc1.Refresh
Adodc1.Recordset.AddNew                        '将文本框中用户输入的各个字段取值填入相应的字段
Adodc1.Recordset.Fields("数据") = strData.Text
End SubPrivate Sub MSComm1_OnComm()
    Dim inByte() As Byte
    Dim i As Integer
    Select Case MSComm1.CommEvent
        Case comEvReceive
        inByte = MSComm1.Input
        For i = 0 To UBound(inByte)
        If Len(Hex(inByte(i))) = 1 Then
            strData = strData & "0" & Hex(inByte(i))
        Else
            strData = strData & Hex(inByte(i))
        End If
        Next
        Text1.Text = strData
        '以下写符合通信协议规定的判断代码处理接收数据
        
     End Select
End SubPrivate Sub Form_Load()
    With MSComm1
        .CommPort = 1
        .Settings = "9600,n,8,1"
        .InBufferCount = 0
        .InputLen = 0
        .RThreshold = 1
        .InputMode = comInputModeBinary '以2进制接收
        .PortOpen = True
    End With
    Text1 = ""
End Sub'关闭通信端口,停止程序运行
Private Sub Cmdquit_Click()
  MSComm1.PortOpen = False
  End
End Sub

解决方案 »

  1.   

    LZ:先不考虑校验问题,你接收的1长串(33字节组成)16进制字符串。
    用Mid函数根据协议按位置切割为你所需的数据。你这些数据似乎是BCD码(8421码)组成。
    Option Explicit
        Dim strData As String
        Dim dateSj As String
        Dim timeSj As String
        Dim jhSj As StringPrivate Sub MsComm1_OnComm()
        Dim inByte() As Byte
        Dim i As Integer
        Select Case MSComm1.CommEvent
            Case comEvReceive
            inByte = MSComm1.Input
            For i = 0 To UBound(inByte)
            If Len(Hex(inByte(i))) = 1 Then
                strData = strData & "0" & Hex(inByte(i))
            Else
                strData = strData & Hex(inByte(i))
            End If
            Next
            Text1.Text = strData
            '以下写符合通信协议规定的判断代码处理接收数据
            If Mid(strData, 1, 2) = "A5" And Len(strData) = 66 Then
                dateSj = Mid(strData, 3, 2) & "-" & Mid(strData, 5, 2) '
                timeSj = Mid(strData, 7, 2) & ":" & Mid(strData, 9, 2) & ":" & Mid(strData, 11, 2)
                jhSj = Mid(strData, 13, 4)
                '其它都按上述方法处理
                '
                strData = ""
            End If
         End Select
    End SubPrivate Sub Form_Load()
        With MSComm1
            .CommPort = 1
            .Settings = "9600,n,8,1"
            .InBufferCount = 0
            .InputLen = 0
            .RThreshold = 1
            .InputMode = comInputModeBinary '以2进制接收
            .PortOpen = True
        End With
        Text1 = ""
    End Sub
      

  2.   

            If Mid(strData, 1, 2) = "A5" And Len(strData) = 66 Then
                dateSj = Mid(strData, 3, 2) & "-" & Mid(strData, 5, 2) '
                timeSj = Mid(strData, 7, 2) & ":" & Mid(strData, 9, 2) & ":" & Mid(strData, 11, 2)
                jhSj = Mid(strData, 13, 4)
                '其它都按上述方法处理
                '
                strData = ""
            End If
    朋友:这个你能大概的给讲解一下吗,我对这个不懂,谢谢。还有提取出来的东西怎么让他现在在文本框里呢?
      

  3.   

    dateSj = Mid(strData, 3, 2) & "-" & Mid(strData, 5, 2) ' 
    这个是怎么看的阿?
      

  4.   

    Mid 函数
    返回 Variant (String),其中包含字符串中指定数量的字符。
    语法
    Mid(string, start[, length])
    Mid 函数的语法具有下面的命名参数:
    部分 说明 
    string 必要参数。字符串表达式,从中返回字符。如果 string 包含 Null,将返回 Null。 
    start 必要参数。为 Long。string 中被取出部分的字符位置。如果 start 超过 string 的字符数,Mid 返回零长度字符串 ("")。 
    length 可选参数;为 Variant (Long)。要返回的字符数。如果省略或 length 超过文本的字符数(包括 start 处的字符),将返回字符串中从 start 到尾端的所有字符。 
    Mid 函数示例
    本示例使用 Mid 语句来得到某个字符串中的几个字符。
    Dim MyString, FirstWord, LastWord, MidWords
    MyString = "Mid Function Demo"   建立一个字符串。
    FirstWord = Mid(MyString, 1, 3)   ' 返回 "Mid"。
    LastWord = Mid(MyString, 14, 4)   ' 返回 "Demo"。
    MidWords = Mid(MyString, 5)   ' 返回 "Funcion Demo"。
    Private Sub MsComm1_OnComm()
        Dim inByte() As Byte
        Dim i As Integer
        Select Case MSComm1.CommEvent
            Case comEvReceive
            inByte = MSComm1.Input
            For i = 0 To UBound(inByte)
            If Len(Hex(inByte(i))) = 1 Then
                strData = strData & "0" & Hex(inByte(i))
            Else
                strData = strData & Hex(inByte(i))
            End If
            Next
            Text1.Text = strData
            '以下写符合通信协议规定的判断代码处理接收数据
            If Mid(strData, 1, 2) = "A5" And Len(strData) = 66 Then
                dateSj = Mid(strData, 3, 2) & "-" & Mid(strData, 5, 2) '
                Text2 = dateSj
                timeSj = Mid(strData, 7, 2) & ":" & Mid(strData, 9, 2) & ":" & Mid(strData, 11, 2)
                Text3 = timeSj
                jhSj = Mid(strData, 13, 4)
                Text4 = jhSj
                '其它都按上述方法处理
                '
                strData = ""
            End If
         End Select
    End Sub
      

  5.   

    Private Sub MsComm1_OnComm()
        Dim inByte() As Byte
        Dim i As Integer
        Select Case MSComm1.CommEvent
            Case comEvReceive
            inByte = MSComm1.Input
            For i = 0 To UBound(inByte)
            If Len(Hex(inByte(i))) = 1 Then
                strData = strData & "0" & Hex(inByte(i))
            Else
                strData = strData & Hex(inByte(i))
            End If
            Next
            Text1.Text = strData
            '以下写符合通信协议规定的判断代码处理接收数据
            If Mid(strData, 1, 2) = "A5" And Len(strData) = 66 Then
                dateSj = Mid(strData, 3, 2) & "-" & Mid(strData, 5, 2) & "-" & Mid(strData, 7, 2)'
                Text2 = dateSj
                timeSj = Mid(strData, 9, 2) & ":" & Mid(strData, 11, 2) & ":" & Mid(strData, 13, 2)
                Text3 = timeSj
                jhSj = Mid(strData, 15, 4)
                Text4 = jhSj
                '其它都按上述方法处理
                '
                strData = ""
            End If
         End Select
    End Sub
      

  6.   

    谢谢你的讲解,但我是个初学者,有点看不懂你说的MID函数的例子,我想知道点简单的,就是怎么看
    dateSj = Mid(strData, 3, 2) & "-" & Mid(strData, 5, 2) & "-" & Mid(strData, 7, 2)'
    timeSj = Mid(strData, 9, 2) & ":" & Mid(strData, 11, 2) & ":" & Mid(strData, 13, 2)
    怎么知道日期就是3,5,7,时间就是9,11,13阿?是简单的奇数递增还是的看我给的数据桢格式阿,要是看数据桢格式那要
    怎么转化阿?
    谢谢你啊!
      

  7.   

    前边会看了,那后边怎么变成4了,这个怎么看啊?
                  timeSj = Mid(strData, 9, 2) & ":" & Mid(strData, 11, 2) & ":" & Mid(strData, 13, 2)
                Text3 = timeSj
                jhSj = Mid(strData, 15, 4)
    前边都是3.2 5.2 7.2 9.2 11.2 13.2 后边怎么是15.4了,这个2变成4怎么看啊?
      

  8.   

    Option Explicit
        Dim strData As String
        Dim dateSj As String
        Dim timeSj As String
        Dim zjhSj As String
        Dim gzdlSj As String
        Dim swsjSj As String
        Dim pfdlSj As String
        Dim pfsjSj As String
        Dim TCUSj As String
        Dim f5Sj As String
        Dim f6Sj As String
        Dim jgSj As String
        
    Private Sub MsComm1_OnComm()
        Dim inByte() As Byte
        Dim i As Integer
        Select Case MSComm1.CommEvent
            Case comEvReceive
            inByte = MSComm1.Input
            For i = 0 To UBound(inByte)
            If Len(Hex(inByte(i))) = 1 Then
                strData = strData & "0" & Hex(inByte(i))
            Else
                strData = strData & Hex(inByte(i))
            End If
            Next
            Text1.Text = strData
            '以下写符合通信协议规定的判断代码处理接收数据
            If Mid(strData, 1, 2) = "A5" And Len(strData) = 66 Then
                dateSj = Mid(strData, 3, 2) & "-" & Mid(strData, 5, 2) & "-" & Mid(strData, 7, 2)       '日期显示
                Text2 = dateSj
                timeSj = Mid(strData, 9, 2) & ":" & Mid(strData, 11, 2) & ":" & Mid(strData, 13, 2)     '时间显示
                Text3 = timeSj
                zjhSj = Mid(strData, 15, 4)                                                             '主机号显示
                Text4 = zjhSj
                swsjSj = Mid(strData, 31, 2)                                                            '上网时间
                Text5 = swsjSj
                gzdlSj = Mid(strData, 35, 4)                                                            '工作电流
                Text6 = gzdlSj
                pfdlSj = Mid(strData, 39, 4)                                                            '排风电流
                Text7 = pfdlSj
                pfsjSj = Mid(strData, 43, 4)                                                            '排风时间
                Text8 = pfsjSj
                TCUSj = Mid(strData, 33, 2)                                                             'TCU状态
                Text9 = TCUSj
                f5Sj = Mid(strData, 55, 4)                                                              '500风压值
                Text10 = f5Sj
                f6Sj = Mid(strData, 59, 4)                                                              '600风压值
                Text11 = f6Sj
                jgSj = Mid(strData, 63, 4)                                                              '结果显示
                Text12 = jgSj
                strData = ""
            End If
         End Select
    End SubPrivate Sub Form_Load()
        With MSComm1
            .CommPort = 1
            .Settings = "9600,n,8,1"
            .InBufferCount = 0
            .InputLen = 0
            .RThreshold = 1
            .InputMode = comInputModeBinary '以2进制接收
            .PortOpen = True
        End With
        Text1 = ""
    End Sub'关闭通信端口,停止程序运行
    Private Sub Cmdquit_Click()
      MSComm1.PortOpen = False
      End
    End Sub我把程序改成这样了,但是我接收的数据没有显示在相应的文本框里,比如日期,时间,主机号等没有显示在text2,text3,text4等文本框里,但是却是接收到了数据,接收到数据都显示在text1中了,这是怎么回事啊,大哥帮我看看吧,我在线等。谢谢了
    我接收到的数据是A50903061120351234EEEE050206030701015001250182EEEEEEEE049805920000C4
      

  9.   

     If Mid(strData, 1, 2) = "A5" And Len(strData) >= 66 Then 
      

  10.   

    大哥好了,谢谢你啊!
    我程序还得继续改下,还得校验每个数据是否是正常的,我先自己改改,不行的话麻烦你多指教。
    如果方便能否留个QQ号,要是忙那咱就CSDN上联系吧,谢谢你啊!