当前位置:编程学习 > VB >>

vb 串口数据发送BUG?

我在处理以下程序时,出现一个很严重的问题,请高手分析一下,谢谢:
strCom2 = "00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01"
strSj = strCom2 
txtReceive.Text = strSj
ReDim sj(31)
    j = 1
    For i = 1 To 32 'Len(strSj) / 2 Step 1
        sj(i - 1) = Val("&H" & Mid(strSj, j, 2))
        j = j + 3
Next
MSComm1.Output = sj

如果按以上程序,
MSComm1.Input 接收的结果是正确的,而且txtReceive.Text也是正确的。

但是,如果‘strSj = strCom2 (取消这句),strSj的值由strSj=txt1.Text(txt1.Text在外部赋值并与strCom2相同时),
txtReceive.Text值正确,但是MSComm1.Input收到的数据,在第十七位多了个“00”("00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00")
不知为什么??????? --------------------编程问答--------------------
Debug.Print txt1.Text,Len(txt1.Text)

确认外部赋值正确,而不是带有回车换行之类字符。 --------------------编程问答--------------------
引用 1 楼 tiger_zhao 的回复:
VB codeDebug.Print txt1.Text,Len(txt1.Text)
确认外部赋值正确,而不是带有回车换行之类字符。


分别打印 strSj ,对比一下也可以。 --------------------编程问答-------------------- For i = 1 To 32

1到32是定死的,怎么会多个00?? --------------------编程问答-------------------- For i = 1 To 32 'Len(strSj) / 2 Step 1 
'默认是Step 1 可以不加

整体来说 我在怀疑你的思路, Mscomm1你发送的是数组 变量定义宣告你也不加, 不知该说啥了....


Dim strCom2$, Tfield&, sj() As Byte, i&, S
Private Sub Command1_Click()
   strCom2 = "00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01"
   txtReceive.Text = strCom2
   S = Split(strCom2, ",")
   ReDim Preserve sj(UBound(S)) As Byte
   For i = LBound(S) To UBound(S)
      sj(i) = Val("&H" & S(i)) '不知你这句话用来干啥,获取16进制值?00 01 有啥意义?
      Print sj(i)
   Next i
   MSComm1.Output = sj
End Sub
--------------------编程问答-------------------- 二进制发送数据 逗号 是没理由发送的, 除非你是文字串发送 --------------------编程问答-------------------- 逗号,其实是为了方便分清数据。所以在转换发送时: 需要j = j + 3 来去 逗号的发送。00,01只是测试信号,在程序的应用上是自动生成的数组。生成在txt1.Text里,然后调用数据发送,但是就是无论是strCom2还是txt1.Text给值strSj 时,txtReceive.Text = strSj 显示都是正确的,比如都是: "00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01" 
但是strCom2给值strSj时发送出去MSComm1.Input收到的数据显示正确。如果是txt1.Text给值strSj时发送出去MSComm1.Input收到的数据显示不正确:"00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,00,01,00,01,00,01,00,01,00,01,00,01,00,01,00" 在收十七位时,多了“00”,后半部分也全部跟着向右退一位。我就不清楚这是什么原因?????
回答楼上:For i = 1 To 32 'Len(strSj) / 2 Step 1 
'Len(strSj) / 2 Step 1 已经加了“'”号,所以不用管它。
--------------------编程问答-------------------- 请大家注意就是:无论是strCom2还是txt1.Text给值strSj 时,txtReceive.Text = strSj 显示都是正确的,所以不存在:“确认外部赋值正确,而不是带有回车换行之类字符”的问题。 --------------------编程问答-------------------- 你是设置MSCOMM控件按文本模式接收,而实际是处理为字节(Byte)接收,当然会每字节自动增加0.
详细见:MSComm 控件的Input 属性及InputMode 属性探究 --------------------编程问答--------------------
引用 8 楼 zdingyun 的回复:
你是设置MSCOMM控件按文本模式接收,而实际是处理为字节(Byte)接收,当然会每字节自动增加0.
详细见:MSComm 控件的Input 属性及InputMode 属性探究

没看请LZ的描述,答错了. --------------------编程问答--------------------
引用 7 楼 denis0750 的回复:
请大家注意就是:无论是strCom2还是txt1.Text给值strSj 时,txtReceive.Text = strSj 显示都是正确的,所以不存在:“确认外部赋值正确,而不是带有回车换行之类字符”的问题。

没有说服力。单行文本不显式回车换行。
用 Debug 输出说话! --------------------编程问答-------------------- 呵呵....大家猜吧

难道 4F 也会多出 00 ? --------------------编程问答-------------------- 详细见:MSComm 控件的Input 属性及InputMode 属性探究
用了:cominputmodebinary
无论原来的数据是什么,在第十六个数据后都出现了“00”然后原来的第十七个后的数据都跟在“00”后。 --------------------编程问答-------------------- 用了VB2005,结果没问题了。但是VB6就不行。想不通 --------------------编程问答-------------------- 显然是你的赋值有问题。
你的数据是以数组的形式发出去的,而你后面却改为字符串。
楼主可以看看MSDN中关于串口通讯的基本知识 --------------------编程问答--------------------
00 是字符串的内部缺省结束符。

strSj = Text1 
strTmp = Split(strSj, ",") 

Redim sj(Lbound(strTmp) To Ubound(strTmp))
For i = Lbound(strTmp) To Ubound(strTmp) 
     sj(i) = Val("&H" & strTmp(i)) 
Next i

MSComm1.Output = sj 
--------------------编程问答-------------------- Veron_04:显然是你的赋值有问题。 
你的数据是以数组的形式发出去的,而你后面却改为字符串。 
楼主可以看看MSDN中关于串口通讯的基本知识

这个跟赋值没有关系。谢谢cbm666,of123的支招。估计是多了一位字符串的内部缺省结束符 --------------------编程问答-------------------- 之前的程序在VB2005上是没问题的
补充:VB ,  基础类
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,