关于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属性)。不合适的时间间隔,有可能会造成停顿,假死。 --------------------编程问答--------------------
你的意思是直接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 --------------------编程问答--------------------
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 , 基础类