付费悬赏
现需要用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()事件,一个字节都没有收到?
这是什么原因呢?
急需解答,成功后会付费,谢谢各位了!
参考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事件中处理接收到的数据。
这套系统是将电流信号转换为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安生共同编写:
根据您提供的信息,可能是由于使用了错误的设置或代码而导致 MSCOMM 控件未能正确接收和解析 16 进制数据。下面是一些可能有用的建议:
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)。并且请根据您的实际应用程序需要调整其他串口属性。
InputMode
属性设置为 comInputModeBinary
。这将告诉控件将输入字节视为二进制数据而不是 ASCII 码。例如,您可以在程序启动时使用以下代码段设置此属性:MSComm1.InputMode = comInputModeBinary
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
变量将包含已接收的字节数据。您可以对其进行解码和分析以提取所需的信息。
希望这些建议能够帮助您解决问题。如果您遇到任何进一步的困难,请告诉我,我很乐意为您提供更多帮助。