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

MSComm1.CommPort = 1MSComm1.Settings = "9600,N,8,1"MSComm1.PortOpen = TrueMSComm1.InputMode = comInputModeBinaryMSComm1.InputLen = 1 ✀每次接受(inputlen的值)个字符MSComm1.RThreshold = 1 ✀当接收缓冲区接收的字符数=RThreshold的值时 触发oncome中的comEvReceivePrivate Sub MSComm1_OnComm()Select Case MSComm1.CommEventCase 2 ✀当接收到RThreshold个字符时触发该事件Dim ij%, bufbuf = ""getbyte = MSComm1.InputFor ij = LBound(getbyte) To UBound(getbyte) buf = LTrim(buf) & getbyte(ij) Next data(s) = buf Text15.Text = Text15.Text & ", " & data(s)end selectend subvb 用串口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 = 1MSComm1.Settings = "9600,N,8,1"MSComm1.PortOpen = TrueMSComm1.InputMode = comInputModeBinaryMSComm1.InputLen = Mscomm1.inbuffercount ✀每次接受(inputlen的值)个字符MSComm1.RThreshold = 1 ✀当接收缓冲区接收的字符数=RThreshold的值时 触发oncome中的comEvReceivePrivate Sub MSComm1_OnComm()Select Case MSComm1.CommEventCase 2 ✀当接收到RThreshold个字符时触发该事件Dim ij%, bufbuf = ""getbyte = MSComm1.InputFor ij = LBound(getbyte) To UBound(getbyte)buf = LTrim(buf)&getbyte(ij)&"," data(s) = getbyte(ij) s=s+1 Next Text15.Text = bufend selectend sub就可以了!下面这位朋友用command 和 定时器timer控制接收串行数据,每接收一次数据就在text1里输出:时间+数据,并规定text的容量,满了自动清空,我看明白了,虽然没有切中我的问题,不过我还是要感谢你的回答!!
2026年09月22日 22:38
有1个网友回答
网友(1):

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

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