串口发送数据.......
VB串口发送一组168个字节的数据,其中前6个字节是发送16进制,后面160个字节是发送16进制的ASCII码,第167个字节是全面166个16进制数据的校检和取低位,再转换成16进制的ASCII码,就占了2个字节,全部数据就是168个字节的数据了
这段代码可以实现发送数据了,但是好像稳定性不强,发送的数据可能会经常出错,是不是因为数据长度越大,出错的几率就越大?168个字节的数据发送出错几率大不大呢?
有什么办法可以同样实现以上数据的发送,让发送的数据都正确,或者说可不可以优化一下这段代码呢?
Private Sub clearDksj_Click()
If MSComm1.PortOpen = False Then
MsgBox "请先打开串口!", vbOKOnly + vbExclamation, "提示!"
End If
If MSComm1.PortOpen = False Then Exit Sub
Dim send_buf() As Byte
Dim Abyte(166) As Byte
Dim ss As Single
Dim XX As String
Abyte(0) = &H1F
Abyte(1) = &H6D
Abyte(2) = &H30
Abyte(3) = &H31
Abyte(4) = &H2A
Abyte(5) = &H2B
For I = 6 To 165
Abyte(I) = &H30
Next
For I = 0 To 165
ss1 = ss1 + Val(Abyte(I))
Next
Abyte(166) = ss1 Mod 256
XX = Right("00" & Hex(Abyte(166)), 2)
send_buf = StrConv(Chr(&H1F) & Chr(&H6D) & Chr(&H30) & Chr(&H31) & Chr(&H2A) & Chr(&H2B) & Right(String(160, "0"), 160) & Right("00" & Hex(Abyte(166)), 2), vbFromUnicode)
MSComm1.Output = send_buf
End Sub
[解决办法]
发送端不必将发送数据转换成字符串。当其中有大于 128 的十六进制数时,中文操作系统会自作聪明地进行处理。
Dim Abyte(167) As Byte
Abyte(0) = &H1F
Abyte(1) = &H6D
Abyte(2) = &H30
Abyte(3) = &H31
Abyte(4) = &H2A
Abyte(5) = &H2B
For I = 6 To 165
Abyte(I) = &H30
Next
For I = 0 To 165
ss1 = ss1 + Val(Abyte(I))
Next
XX = Right("0" & Hex(ss1), 2)
Abyte(166) = Asc(Left(XX, 1))
Abyte(167) = Asc(Right(XX, 1))
MSComm1.Output = Abyte
[解决办法]
我认为发送不是问题,只要你的发送缓冲区足够大是没有问题的。问题可能出在你处理字符的问题上。就如楼上所说,ASCII的可表达范围是:&H00~&H7F,如果大于这个数据就不是ASCII码了,你得转换可能需要ChrW来处理了。
[解决办法]
168个字节应该不会的,mscomm默认OutBufferSize是512,你也可以加大
[解决办法]