我需要编写一个RS232串口测量程序
设备是一台工业用实时检测仪,用于检测微小形变、位移,测量精度为0.001mm,测量最大值为100mm。
数据帧格式:
RTU模式
通信参数:波特率38400
数据帧:1个起始位,8个数据位,2个停止位。
测量仪通过四路集线器连接com1连接电脑,需要通过主机发送8个字节查询命令,集线器响应返回21个字节数据。
主机查询命令:80 03 00 00 00 08 5A 1D
集线器响应:80 03 10 xx xx xx xx yy yy yy yy zz zz zz zz ww ww ww ww NN NN
响应数据中,x、y、z、w部分为4个测量数据,我只需要第一个即x部分。每个测量数据为4个字节,第一个字节为符号位,代表正负号,第3、4字节为16进制测量数据。
测量数据转换为10进制后再除以1000即为实际测量数据。
以下我参考串口调试助手编写的代码,但是尝试多次还是达不到我的目的:
现在初始程序界面如下图,在完整版中,我希望实现:
界面只保留 数据1-4 这一块,16进制和字节长度,我并不需要。
程序功能,按下键盘 空格键,测量一次数据,返回10进制实际数据值,显示在text1中,第二次按下空格键,测量值显示在text2中,依次类推......每4次一个循环。
Option Explicit
Dim a As Integer
Dim BytReceived() As Byte
Const Str_Send As String = "8003000000085A1D"
Dim strData As String
Dim lenInput As Integer
Private Sub cmdClear_Click()
strData = ""
RichTextBox1 = ""
TxtSend = ""
End Sub
Private Sub Form_KeyPress(KeyAscii As Integer) '16进制发送
If KeyAscii = 32 Then
Dim sj() As Byte
Dim i As Integer
If Len(Str_Send) Mod 2 = 0 And Len(Str_Send) <> 0 Then '检验16进制字符串长
ReDim sj(Len(Str_Send) / 2 - 1)
For i = 0 To Len(Str_Send) - 1 Step 2
sj(i / 2) = Val("&H" & Mid(Str_Send, i + 1, 2))
Next
If MSComm1.PortOpen = True Then
MSComm1.Output = sj
End If
Else
MsgBox ("格式不对!")
End If
End If
End Sub
'字符串表示的十六进制数据转化为相应的字节串,返回转化后的字节数
Private Sub Form_Load()
MSComm1.Settings = "38400,n,8,2"
MSComm1.InputMode = comInputModeBinary '采用二进制传输
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
MSComm1.RThreshold = 1 '产生MSComm事件
MSComm1.InBufferSize = 1024
RichTextBox1.Text = ""
Text2 = ""
If MSComm1.PortOpen = False Then MSComm1.PortOpen = True
End Sub
Private Sub MSComm1_OnComm() '接收数据
Dim strBuff As String
Select Case MSComm1.CommEvent
Case 2
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived() = strBuff
ReceiveData
lenInput = Len(strData)
Text2 = lenInput \ 2
'数据处理代码
End Select
End Sub
Public Function ReceiveData() '接收数据处理为16进制
Dim i As Integer
For i = 0 To UBound(BytReceived)
If Len(Hex(BytReceived(i))) = 1 Then
strData = strData & "0" & Hex(BytReceived(i))
Else
strData = strData & Hex(BytReceived(i))
End If
Next
RichTextBox1.Text = strData
End Function