首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

串口发送数据.解决方法

2012-03-29 
串口发送数据.......VB串口发送一组168个字节的数据,其中前6个字节是发送16进制,后面160个字节是发送16进

串口发送数据.......
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,你也可以加大
[解决办法]

探讨
串口是不是发送的数据越多越容易出错呢?168个字节的数据会不会经常性的出错?

[解决办法]
我还是固执的认为是你处理字符的问题。
[解决办法]
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

这样发绝对死翘翘,做那么多字符串操作,谁知道在哪里就不能识别了。不论你发的是什么数据,强烈建议都以二进制方式,存在byte数组里,一个字节一个字节的发。
[解决办法]
如果你是以二进制发送,那么你的命令就是错误的

你要把所有数据都存入数组,然后output=数组名 就可以了
[解决办法]
楼主可以参考一下这个程序,串口调试器代码:
http://download.csdn.net/source/1262066

热点排行