求教:串口通信发送、接收16进制数据为何不能正常显示?
MSComm1.InputMode = 1 ' 接收二进制数据
MSComm1.InputLen = 0 ' 一次读取缓冲区内所有数据
'发送数据
Dim sendData() As Byte
sendData() = TextSend.Text '比如输入0077
MsgBox sendData '测试数据正确性,显示0077
MsgBox UBound(sendData) '查看数据占多少字节,这里就不对了,显示为7,不理解,16进制的0077不应该占2个字节吗?
MsgBox sendData(0) '查看第1字节数据,本来希望显示00,可实际显示为48
MsgBox sendData(1) '查看第2字节数据,本来希望显示77,可实际显示为0
MSComm1.Output = sendData '送到串口发送
'接收数据
Dim receiveData() As Byte
Dim HC
receiveData() = MSComm1.Input
MsgBox receiveData '测试数据正确性,显示0077
MsgBox UBound(receiveData) '仍然显示为7
MsgBox receiveData(0) '仍然显示为48
MsgBox receiveData(1) '仍然显示为0
HC = receiveData(0) * 256 + receiveData(1) '先转换为10进制整数,0077的10进制本应是119,可实际显示为12288,很离谱
TextReceive.Text = Hex(HC) '再把这个整数转换成16进制字符显示,希望显示0077,可实际显示为3000,完全不对
我的本意是输入一个16进制字符串,然后串口以16进制发送,另一台机器以16进制接收,然后显示出来的仍是16进制的字符串,应该跟输入的一模一样。不知道我有没有讲明白,还请高手赐教!多谢了
[解决办法]
你混淆了字符 ASCII 码和实际数值的概念。
'sendData() = TextSend.Text
Redim sendData(Len(txtSend) \ 2 - 1)
For i = 0 To Ubound(sendData)
sendData(i) = Val("&H" & Mid(txtSend, i * 2 + 1, 2))
Next i
[解决办法]
Dim txtSend As StringDim sendData() As ByteDim i As Long txtSend = TextSend.TextRedim sendData(Len(txtSend) \ 2 - 1) For i = 0 To Ubound(sendData) sendData(i) = Val("&H" & Mid(txtSend, i * 2 + 1, 2)) Next i