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

关于vb串口的问题,请教、、、

我从单片机中发送了N个字节,在VB中分别将每个字节在不同的text中显示,现在显示的结果正确,但是顺序却一直变化,例如发送1、2、3、4,在text1中显示1,text2中显示2,text3中显示3,text4中显示4,现在1、2、3、4显示的顺序不停地变化,我试着在前面发送了一个字节,判断当接收到的第一个字节正确时再显示,但是不正确。。是要加校验位吗,怎么加,还请各位指点!!急!!!! --------------------编程问答-------------------- 代码贴上来看一下。。。。398706948 --------------------编程问答-------------------- 只是顺序错啦,处理一下让它正确显示就得了 --------------------编程问答-------------------- 因为有时序问题,接收数据不完整。 --------------------编程问答-------------------- 每次接受数据前,先把串口接收缓冲区清零,然后判断接收缓冲区的字节数,如果符合要求再接收,然后按顺序显示到文本框就行了。
--------------------编程问答-------------------- 恩。楼主的技术排名 是个亮点啊 --------------------编程问答-------------------- 这是我的部分代码,

Private Sub Timer1_Timer()


If MSComm1.InBufferCount > 0 Then


buf = MSComm1.Input
        
        For i = 1 To Len(buf)
        
            If i = 6 Then
            
                S = hex(Asc(Mid$(buf, i, 1)))
            
            Else
            
            data(i) = HEX_to_DEC(Hex(Asc(Mid$(buf, i, 1)))) '接收到的字符转换为ASCII,到16进制数,再到十进制
            
            End If
        
        Next

If data(1) = 128 Then   ' 检测起始位

    Text2.Text = data(2)

    Text3.Text = data(3)

    Text4.Text = data(4)

    Text5.Text = data(5)

    Text1.Text = Text1.Text & "  " & S

End If

End If

MSComm1.InBufferCount = 0    '清空缓冲区

End Sub




Public Function HEX_to_DEC(ByVal Hex As String) As Long  '16进制转十进制
    
    Dim i As Long
    
    Dim B As Long
     
    
    Hex = UCase(Hex)
    
    For i = 1 To Len(Hex)
        
        Select Case Mid(Hex, Len(Hex) - i + 1, 1)
            
            Case "0": B = B + 16 ^ (i - 1) * 0
            Case "1": B = B + 16 ^ (i - 1) * 1
            Case "2": B = B + 16 ^ (i - 1) * 2
            Case "3": B = B + 16 ^ (i - 1) * 3
            Case "4": B = B + 16 ^ (i - 1) * 4
            Case "5": B = B + 16 ^ (i - 1) * 5
            Case "6": B = B + 16 ^ (i - 1) * 6
            Case "7": B = B + 16 ^ (i - 1) * 7
            Case "8": B = B + 16 ^ (i - 1) * 8
            Case "9": B = B + 16 ^ (i - 1) * 9
            Case "A": B = B + 16 ^ (i - 1) * 10
            Case "B": B = B + 16 ^ (i - 1) * 11
            Case "C": B = B + 16 ^ (i - 1) * 12
            Case "D": B = B + 16 ^ (i - 1) * 13
            Case "E": B = B + 16 ^ (i - 1) * 14
            Case "F": B = B + 16 ^ (i - 1) * 15
        
        End Select
    
    Next i
    
    HEX_to_DEC = B

End Function


出现了几个问题,我接收模式为comInputModeText,因此再发送数据时不能大于128,16进制不能大于80H,如果要改为comInputModeBinary接受,数据接收这块要怎样处理成十进制呢,我改了好久也没有正确

另外,就现在除了刚才那个问题,还有就是显示的时候会连续接收几次然后停顿0.5秒

我刚接触VB,所以对很多知识点还很迷茫,还请大家指点!!! --------------------编程问答-------------------- --------------------编程问答-------------------- 你接收过来的数据直接用数组处理多好?
二进制接收,也是以字节为单位进行接收的,拿过来直接处理就行了,还要什么转换成10进制。
你的接收间隔是多长时间(timer的interval属性)。不合适的时间间隔,有可能会造成停顿,假死。 --------------------编程问答--------------------
引用 8 楼 lixiyo 的回复:
二进制接收,也是以字节为单位进行接收的,拿过来直接处理就行了,还要什么转换成10进制。
你的接收间隔是多长时间(timer的interval属性)。不合适的时间间隔,有可能会造成停顿,假死。


你的意思是直接buf = MSComm1.Input,然后分成N个字节吗?   还有我的接收间隔是5,和单片机的发送间隔相同,这样会出现问题吗
--------------------编程问答-------------------- 因为LZ的逻辑错误了,所以程序结果就不对了。
按你说的,单片机每次发送5个字节,然后间隔一个时间。那么你就最好用mscomm的事件方式,而不是用timer搞查询的方式,并设置RThreshold=5

单片机总是发送1,2,3,4然后延时0.5秒(假如),text1,2,3,4显示的不是1,2,3,4,而是不断变化,说明,mscomm的缓冲区接受到1,2,3,4,1的时候,你查询了mscomm数据并清空了,下次再次查询的时候缓冲区数据是2,3,4,1。。。就是说1,2,3,4是一个祯,你取到的数据跨祯了,原因可能是1,你的定时器和单片机的定时器不同步(timer本来就不准确,2,单片机发送到1,2的时候你的timer查询,清空了缓冲区,后面的数据就一直错下去了。

二进制接受,就定义一个字节类型的不定产度数组,
dim x() as byte:x=mscomm1.input --------------------编程问答--------------------
引用 10 楼 spt_petrolor 的回复:
因为LZ的逻辑错误了,所以程序结果就不对了。
按你说的,单片机每次发送5个字节,然后间隔一个时间。那么你就最好用mscomm的事件方式,而不是用timer搞查询的方式,并设置RThreshold=5

单片机总是发送1,2,3,4然后延时0.5秒(假如),text1,2,3,4显示的不是1,2,3,4,而是不断变化,说明,mscomm的缓冲区接受到1,2,3,4,1的时候,你查询了mscom……

Private Sub Mscomm1_Oncomm()
Dim bte() As Byte
    Select Case MSComm1.CommEvent
      Case comEvReceive
      MSComm1.RThreshold = 0            
      bte = MSComm1.Input
      Text1.Text = Text1.Text & "  " & bte(0) & bte(1)
      MSComm1.InBufferCount = 0
    End Select
MSComm1.RThreshold = 2
End Sub

这个写的哪里有问题吗,单片机发送了128和120两个字节,但是接收情况就像下面的
128120  120128  128120  128120  128120  128120  128120  128120  128120  128120  128120  128120  120128  128120  128120  128120  128120  128120  128120  120128  128120  128120  128120  128120  128120  128120  128120  128120  128120  120128  128120  120128  128120  128120  128120  128120  128120  128120  128120  128120  128120  128120  128120  128120  120128  128120  128120  128120  128120  128120  128120  128120  128120  120128  128120  128120  128120  128120  120128  128120  128120  120128  128120  120128  128120  120128  128120  128120  128120  120128  
会出现顺序问题,不知道怎么回事、、 --------------------编程问答--------------------
Private Sub Mscomm1_Oncomm()
Dim bte() As Byte
  Select Case MSComm1.CommEvent
  Case comEvReceive
  MSComm1.RThreshold = 0   '接收门限是0,每接收到1个字节就产生comEvReceive事件
  bte = MSComm1.Input'二进制接收缓冲区,缓冲区数据是多少字节你是不知道的
  Text1.Text = Text1.Text & " " & bte(0) & bte(1)'要是这里缓冲区只有1字节,就只接收到1个字节,小心下标问题
  MSComm1.InBufferCount = 0'清除缓冲区
  End Select
MSComm1.RThreshold = 2
End Sub

看看给你程序的注释。
应该自己维护一个缓冲区,每接收到若干字节都放在自己的缓冲区。然后判断自己缓冲区的长度是不是含有一个帧的起始,结束字节,然后处理,并清理自己的缓冲区里面已经处理过的数据。
比如:自己的缓冲区要有一个变量存储缓冲区的起始位置,缓冲区的结束位置,用于防止自己的缓冲区溢出。处理了一个数据帧后,要调整自己的缓冲区
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,