[付费悬赏] 用VB6.0接收16进制数据

付费悬赏
现需要用VB6.0 通过串口来接收一组16进制的数据 01 03 10 09 CE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 6C 5B 。
我用了MSCOMM控件用二进制形式接收不了数据。
PS:
这套系统是将电流信号转换为16进制数字信号传输到电脑
我使用调试软件可以接收到数据
但是用vb编程时好像触发不了MSComm1_OnComm()事件,一个字节都没有收到?
这是什么原因呢?
急需解答,成功后会付费,谢谢各位了!

img

img

参考gpt,以下是VB6代码,可以通过串口接收一组16进制数据:


Private Sub Form_Load()
    With MSComm1
        .CommPort = 1 ' 设置使用的串口号
        .Settings = "9600,n,8,1" ' 设置串口通信参数
        .InputMode = comInputModeBinary ' 设置输入模式为二进制模式
        .InBufferSize = 1024 ' 设置缓冲区大小
        .RThreshold = 1 ' 设置读取数据的阈值
        .SThreshold = 0 ' 设置发送数据的阈值
        .Handshaking = comNone ' 设置握手方式
        .NullDiscard = False ' 不丢弃空字符
        .PortOpen = True ' 打开串口
    End With
End Sub

Private Sub MSComm1_OnComm()
    Dim data As String
    
    If MSComm1.CommEvent = comEvReceive Then ' 判断事件类型是否为接收数据
        data = HexToString(MSComm1.Input) ' 将接收到的二进制数据转换为字符串
        Debug.Print "Received data: " & data ' 输出接收到的数据
    End If
End Sub

Private Function HexToString(ByVal hex As String) As String
    Dim i As Long
    
    If Len(hex) Mod 2 = 1 Then ' 如果字符串长度为奇数,补一个0
        hex = "0" & hex
    End If
    
    For i = 1 To Len(hex) Step 2 ' 将每两个字符转换为一个字节
        HexToString = HexToString & Chr(CByte("&H" & Mid(hex, i, 2)))
    Next i
End Function


上述代码中,使用了MSCOMM控件来实现串口通信,通过设置InputMode属性为comInputModeBinary来设置输入模式为二进制模式,然后通过HexToString函数将接收到的二进制数据转换为字符串。在MSComm1_OnComm事件中判断事件类型是否为接收数据,如果是则输出接收到的数据。

以下是使用MSCOMM控件在VB6.0中接收16进制数据的完整示例代码

Private Sub Form_Load()
    With MSComm1
        .CommPort = 1 ' 设置使用的串口号
        .Settings = "9600,n,8,1" ' 设置串口参数
        .InputMode = comInputModeBinary ' 设置输入模式为二进制
        .InBufferSize = 1024 ' 设置输入缓冲区大小
        .RThreshold = 1 ' 设置接收到一个字符就触发 OnComm 事件
        .SThreshold = 0 ' 禁用发送缓冲区
        .PortOpen = True ' 打开串口
    End With
End Sub

Private Sub MSComm1_OnComm()
    Dim data As String
    If MSComm1.CommEvent = comEvReceive Then ' 接收到数据
        data = HexToString(MSComm1.Input) ' 将接收到的二进制数据转换成字符串
        Debug.Print data ' 输出接收到的数据
    End If
End Sub

Private Function HexToString(ByVal hexString As String) As String
    Dim i As Long, hexValue As String, asciiValue As String
    For i = 1 To Len(hexString) Step 2
        hexValue = Mid(hexString, i, 2)
        asciiValue = Chr("&H" & hexValue)
        HexToString = HexToString & asciiValue
    Next i
End Function


在上述代码中,首先在窗体加载时初始化了MSCOMM控件,并设置了串口号、串口参数、输入模式、输入缓冲区大小等参数,并打开了串口。然后,在MSComm1_OnComm事件中,判断是否接收到数据,如果是,则将接收到的二进制数据转换成字符串,并输出到调试窗口中。最后,定义了一个HexToString函数,用于将16进制数据转换成字符串。

您可以根据实际情况修改串口号、串口参数、输入缓冲区大小等参数,并在MSComm1_OnComm事件中处理接收到的数据。

img


img

这套系统是将电流信号转换为16进制数字信号传输到电脑
我使用调试软件可以接收到数据
但是用vb编程时好像触发不了MSComm1_OnComm()事件,一个字节都没有收到?
这是什么原因呢?

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,确保你已经将MSCOMM控件添加到你的VB6.0工程中了。接下来,你需要设置MSCOMM控件的属性,以便它能够正确接收并解析16进制数据。

在Form_Load事件中,添加以下代码:

Private Sub Form_Load()

    '设置串口通讯的属性
    MSComm1.CommPort = 1 '串口号,可以根据实际情况进行修改
    MSComm1.Settings = "9600,N,8,1" '波特率、校验位、数据位、停止位
    MSComm1.InputMode = comInputModeBinary '设置为二进制输入模式
    
    '打开串口
    MSComm1.PortOpen = True
    
End Sub

接下来,我们需要在MSComm控件的OnComm事件中读取数据。在MSComm_OnComm事件中,添加以下代码:

Private Sub MSComm1_OnComm()

    Dim buffer As String '定义缓冲区
    Dim hexData As String '定义十六进制数据
    
    '判断是否有数据到达
    If MSComm1.CommEvent = comEvReceive Then
        
        '读取数据
        buffer = MSComm1.Input
        
        '将二进制数据转换为十六进制字符串
        hexData = HexDump(buffer)
        
        '输出十六进制数据
        Debug.Print "Received data: " & hexData
        
    End If

End Sub

HexDump函数用于将二进制数据转换为十六进制字符串,代码如下:

Private Function HexDump(data As String) As String

    Dim hexStr As String
    Dim i As Long
    
    For i = 1 To Len(data)
        hexStr = hexStr & Right("0" & Hex(Asc(Mid(data, i, 1))), 2)
    Next
    
    HexDump = hexStr
    
End Function

运行程序,连接串口并发送数据,你应该能够看到接收到的16进制数据在调试窗口中输出。

最后,为了保证程序的稳定性,你需要在程序结束时关闭串口,代码如下:

Private Sub Form_Unload(Cancel As Integer)

    If MSComm1.PortOpen Then
        MSComm1.PortOpen = False
    End If
    
End Sub

如果你遇到了任何问题,请在评论区留言。感谢您的付费悬赏,我非常乐意提供帮助!
如果我的回答解决了您的问题,请采纳!

该回答引用ChatGPT
您好,您请尝试在代码中手动打开MSComm控件,并确保已经正确设置端口号、波特率、数据位、停止位等参数。

同时,也需要手动设置控件的RThreshold和SThreshold属性为1,即只要接收到1个字节的数据,就会触发MSComm1_OnComm()事件。

另外,也需要确保串口连接的线路正确并且没有问题,例如需要使用正确的电缆进行连接,确保RXD和TXD引脚正确连接。

最后,建议在代码中通过调用控件的Output和Input方法来发送和接收数据,并通过调试工具来检查发送和接收的数据是否符合预期。

该回答引用于gpt与OKX安生共同编写:
  • 该回答引用于gpt与OKX安生共同编写:

根据您提供的信息,可能是由于使用了错误的设置或代码而导致 MSCOMM 控件未能正确接收和解析 16 进制数据。下面是一些可能有用的建议:

  1. 在使用 MSCOMM 控件之前,确保已经正确地初始化它所连接的串口。您可以在程序启动时使用类似以下代码段的方法打开串口:
Private Sub OpenComPort(port As Integer, baudrate As Long)
   With MSComm1
      .CommPort = port
      .Settings = "baudrate, databits, parity, stopbits"
      .InputLen = 0
      .RThreshold = 1
      .SThreshold = 0
      .Handshaking = comNone
      .DTR = True
      .RTS = True
      .PortOpen = True
      .InBufferCount = 0
   End With
End Sub

其中 port 参数为串口号(例如 COM2),baudrate 参数为波特率(例如 9600)。并且请根据您的实际应用程序需要调整其他串口属性。

  1. 使用 MSCOMM 控件读取串口数据时,请将 InputMode 属性设置为 comInputModeBinary。这将告诉控件将输入字节视为二进制数据而不是 ASCII 码。例如,您可以在程序启动时使用以下代码段设置此属性:
MSComm1.InputMode = comInputModeBinary
  1. 在 MSCOMM 控件接收到数据并触发 OnComm 事件时,请使用以下代码段从输入缓冲区中读取字节数据:
Private Sub MSComm1_OnComm()
   Dim data As Variant
   If MSComm1.CommEvent = comEvReceive Then
      data = MSComm1.Input
      ' process received data here '
   End If
End Sub

其中 data 变量将包含已接收的字节数据。您可以对其进行解码和分析以提取所需的信息。

希望这些建议能够帮助您解决问题。如果您遇到任何进一步的困难,请告诉我,我很乐意为您提供更多帮助。