我下位机的有三个地址:"0106"、“0206”、“0306”;,如果我在接收到
":020600010025FA"的数据。一个数据16位(十六进制),以冒号开始,“FA”是校验位。
那位大侠帮帮小弟。怎么判断接收到的数据是“0206”(地址位)“0001”(功能位),最终得到想要的数据位“0025”。让他(0025)在label里显示出来。希望大侠能给出提示。或写点类似的代码,不胜感激。(不明白的地方我在补充)
":020600010025FA"的数据。一个数据16位(十六进制),以冒号开始,“FA”是校验位。
那位大侠帮帮小弟。怎么判断接收到的数据是“0206”(地址位)“0001”(功能位),最终得到想要的数据位“0025”。让他(0025)在label里显示出来。希望大侠能给出提示。或写点类似的代码,不胜感激。(不明白的地方我在补充)
前者简单,后者需要详细的通信协议.
前者虽然简单,但LZ没描述清楚
":020600010025FA"的数据。一个数据16位(十六进制),以冒号开始,“FA”是校验位。
一个数据16位(十六进制),应该是15字节长(ASCII字符.
'返回转化后的字节数
Function strHexToByteArray(strText As String, bytByte() As Byte) As Integer
Dim HexData As Integer '十六进制(二进制)数据字节对应值
Dim hstr As String * 1 '高位字符
Dim lstr As String * 1 '低位字符
Dim HighHexData As Integer '高位数值
Dim LowHexData As Integer '低位数值
Dim HexDataLen As Integer '字节数
Dim StringLen As Integer '字符串长度
Dim Account As Integer '计数
strTestn = "" '设初值
HexDataLen = 0
strHexToByteArray = 0
StringLen = Len(strText)
Account = StringLen \ 2
ReDim bytByte(Account)
For n = 1 To StringLen
Do '清除空格
hstr = Mid(strText, n, 1)
n = n + 1
If (n - 1) > StringLen Then
HexDataLen = HexDataLen - 1
Exit For
End If
Loop While hstr = " "
Do
lstr = Mid(strText, n, 1)
n = n + 1
If (n - 1) > StringLen Then
HexDataLen = HexDataLen - 1
Exit For
End If
Loop While lstr = " "
n = n - 1
If n > StringLen Then
HexDataLen = HexDataLen - 1
Exit For
End If
HighHexData = ConvertHexChr(hstr)
LowHexData = ConvertHexChr(lstr)
If HighHexData = -1 Or LowHexData = -1 Then '遇到非法字符中断转化
HexDataLen = HexDataLen - 1
Exit For
Else
HexData = HighHexData * 16 + LowHexData
bytByte(HexDataLen) = HexData
HexDataLen = HexDataLen + 1
End If
Next n
If HexDataLen > 0 Then '修正最后一次循环改变的数值
HexDataLen = HexDataLen - 1
ReDim Preserve bytByte(HexDataLen)
Else
ReDim Preserve bytByte(0)
End If
If StringLen = 0 Then '如果是空串,则不会进入循环体
strHexToByteArray = 0
Else
strHexToByteArray = HexDataLen + 1
End If
End Function
楼主可以参考上述代码来判断前4个和后4个字符串是否是相应的地址为和校验位,然后再把剩下的作为内容显示出来就可以了。
":020600010025FA:010600020013DF:030600020001F1:0020600020015FA"的数据。数据格式16位(十六进制),以冒号开始,“FA”是校验位。 那位大侠帮帮小弟。怎么吧接收到的数据“:020600010025FA”其中的“0025以十进制显示出来。”“0206”(地址位)“0001”(功能位),最终得到想要的数据位“0025”。让他(0025)以十进制在label里显示出来。希望大侠能给出提示。或写点类似的代码,不胜感激。(不明白的地方我在补充)
Dim str As String, a() As String, i As Integer
Label1.Caption = ""
str = ":020600010025FA:010600020013DF:030600020001F1:020600020015FA"
a = Split(str, ":")
For i = 1 To UBound(a)
Label1.Caption = Label1.Caption + CStr(CLng("&H" & Mid(a(i), 9, 4))) + ";"
Next i
End Sub是要这个效果吗?
Dim strData As String
Private Sub Form_Load()
MSComm1.Settings = "9600,N,8,1"
MSComm1.RThreshold = 1
MSComm1.CommPort = 1
MSComm1.InputMode = comInputModeText '按文本接收
MSComm1.PortOpen = True
End SubPrivate Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case 2
MSComm1.InputLen = 0
strData = strData & MSComm1.Input
Text1 = strData
If Mid(strData, 1, 1) = ":" And Right(strData, 2) = "FA" Then
Label1.Caption = Val(Mid(strData, 10, 4)) '这是按0025是10进制数
Label2.Caption = Val("&H" & Mid(strData, 10, 4)) '这是按0025是16进制数
strData = ""
End If
End Select
End Sub