vb串行通信接受一串字节数是,如何一个字节一个字节的全部接受出来

MSComm1.CommPort=1MSComm1.Settings="9600,N,8,1"MSComm1.PortOpen=TrueMSComm1.InputMode... MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
MSComm1.InputMode = comInputModeBinary
MSComm1.InputLen = 1 '每次接受(inputlen的值)个字符
MSComm1.RThreshold = 1 '当接收缓冲区接收的字符数=RThreshold的值时 触发oncome中的comEvReceive

Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case 2 '当接收到RThreshold个字符时触发该事件

Dim ij%, buf
buf = ""
getbyte = MSComm1.Input
For ij = LBound(getbyte) To UBound(getbyte)
buf = LTrim(buf) & getbyte(ij)
Next
data(s) = buf
Text15.Text = Text15.Text & ", " & data(s)
end select
end sub

vb 用串口1 ,将串口调试元件设置串口2 ,串口1和串口2连接
我在串口调试发这样的数据(十六进制):c7 08 01 11 1a c8(十进制为:199 8 1 17 26 200)
text15接收到得的内容为“199,8,” 后面的接受不到了

后来我把 MSComm1.InputLen = 1 改成:MSComm1.InputLen = mscomm1.inbuffercount
还是用串口调试发上面同样的数据,text15接收到得内容变成“199811726200,”(注意text15里有一个逗号) 是 全部接受了,但是没有一个字节一个字节的分开

用串口调试软件一个字节数,点一次发送,肯定能接受正确(因为每次发送之间有足够时间),但是如果我的下位机程序发一个数组(a(1)=199,a(2)=8...),大家知道程序执行是很快的,如果用MSComm1.InputLen = 1方式,不能一次接收全部数据,如果用
MSComm1.InputLen = mscomm1.inbuffercount方式,数据一团排,不会自动分开,根本分辨不了。如果每个数组元素之间加一个延时delay_ms(5)也是可以的,但是我的队友不想用延时,请问各位大侠vb方面有什么方法当下位机发一排字节数过来的,我的vb既能一次全部接受,而且每一个字节每一个字节分开,然后显示出来。
问题已解决,我把lbound和ubound的意思搞错了,程序改成:
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
MSComm1.InputMode = comInputModeBinary
MSComm1.InputLen = Mscomm1.inbuffercount '每次接受(inputlen的值)个字符
MSComm1.RThreshold = 1 '当接收缓冲区接收的字符数=RThreshold的值时 触发oncome中的comEvReceive

Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case 2 '当接收到RThreshold个字符时触发该事件

Dim ij%, buf
buf = ""
getbyte = MSComm1.Input
For ij = LBound(getbyte) To UBound(getbyte)
buf = LTrim(buf)&getbyte(ij)&","
data(s) = getbyte(ij)
s=s+1
Next
Text15.Text = buf
end select
end sub

就可以了!

下面这位朋友用command 和 定时器timer控制接收串行数据,每接收一次数据就在text1里输出:时间+数据,并规定text的容量,满了自动清空,我看明白了,虽然没有切中我的问题,不过我还是要感谢你的回答!!
展开
 我来答
Zaxife
2009-11-13 · TA获得超过1254个赞
知道小有建树答主
回答量:1138
采纳率:0%
帮助的人:425万
展开全部

试试我下面的程序,前提是你按规范发送数据。

Private Sub Command1_Click()

    Timer1.Enabled = True

    Command1.BackColor = vbGreen

End Sub

Private Sub Command2_Click()

    Text1.Text = ""

End Sub

Private Sub Form_Load()

    '通讯口初始化:

    

    With MSComm1

        .Settings = "9600,n,8,2"

        .CommPort = 3

        .InputMode = comInputModeBinary

        .InBufferCount = 0

        .OutBufferCount = 0

        .RThreshold = 0

        .SThreshold = 0

        .PortOpen = True

    End With

    Text1.Text = ""

End Sub

Private Sub Text1_Change()

    If Len(Text1.Text) > 10000 Then Text1.Text = ""

End Sub

Private Sub Timer1_Timer()

    '采用轮循法采集数据

    Dim inx() As Byte

    Dim strTemp As String

    Dim strTemp1 As String

    Dim ReceivedLen As Integer

    Timer1.Enabled = False '关闭定时器

    

    If MSComm1.InBufferCount > 0 Then

        ReceivedLen = MSComm1.InBufferCount

        inx = MSComm1.Input

        For i = 0 To UBound(inx)

            strTemp1 = Hex(inx(i))

            If Len(strTemp1) > 1 Then

                strTemp = strTemp & strTemp1 & " "

            Else

                strTemp = strTemp & "0" & strTemp1 & " "

            End If

        Next i

        Text1.Text = Text1.Text & Format(Second(Now), "00") & Right(Format(Str(Timer), "0.00"), 3) & "   " & strTemp & vbCrLf

        Text1.SelStart = Len(Text1.Text)

    End If

    

    Timer1.Enabled = True '打开定时器

    Label1.Caption = Now()

    

End Sub

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式