YC3354 2017-03-27 02:06 采纳率: 62.5%
浏览 1228
已结题

VB串口编程--测量程序

  我需要编写一个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

  • 写回答

2条回答 默认 最新

  • devmiao 2017-03-27 05:01
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大