这是个用mscomm控件接收串口数据的程序.串口每接受一个字节触发接受程序.从串口读取然后发送到文本框显示.发送的数据是55,2000-0000的递减(即55 20 00 55 ff 1f 55 fe 1f 55 fd 1f....55 05 00 55 04 00 55 03 00..).可以确定发送端发送数据没有问题.可文本框显示先是错误.后又正确然后又错误(具体数据见后面).为什么呢.下面依次是vb原程序和文本框输出**********程序代码*********************Dim ErroArray(30000) As Byte
Dim BufferByte() As Byte
Dim i As Integer
Dim CommandFlag As Integer
Dim buffer As Variant
Private Sub Command1_Click()
CommandFlag = 1
MSComm1.Output = "1"
End SubPrivate Sub Command2_Click()
CommandFlag = 0
MSComm1.Output = "0"End SubPrivate Sub Command3_Click()
Text1.Text = ""End SubPrivate Sub Form_Load()
i = 0
CommandFlag = 2
MSComm1.PortOpen = True
End SubPublic Sub MSComm1_OnComm() '接收数据触发OnComm()事件
Select Case MSComm1.CommEvent '在CommEvent中接收数据
Case comEvReceive
If CommandFlag = 0 Then
Text1.Text = Text1.Text & vbCrLf + "写55完成"
Else
buffer = MSComm1.Input '读出借收到的数据到variant变量buffer
BufferByte = buffer '存入byte型
ErroArray(i) = BufferByte(0) '将接收到的数据保存到数组中
i = i + 1 '数组索引加一
Text1.Text = Text1.Text + " " + CStr(Hex(ErroArray(i - 1))) '在文本框中显示接收到的16进制数据
DoEvents
End If
End Select
End Sub
********输出结果******************55 0 20 55 F5 1F 55 3F 55 3F 55 3F 55 3F 55 3F 55
^^^^^^^^^^
第一个是正确的
3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
这是错误的输出
3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 AC 1F 55 7F 1F 55 7E 1F 55 7D
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
从这个地方开始是正确的
1F 55 7C 1F 55 7B 1F 55 7A 1F 55 79 1F 55 78 1F 55 77 1F 55 76 1F 55 75 1F 55 74 1F 55 73 1F 55 72 1F 55 71 1F 55 70 1F 55 6F 1F 55 6E 1F 55 6D 1F 55 6C 1F 55 6B 1F 55 6A 1F 55 69 1F 55 68 1F 55 67 1F 55 66 1F 55 65 1F 55 64 1F 55 63 1F 55 62 1F 55 61 1F 55 60 1F 55 5F 1F 55 5E 1F 55 5D 1F 55 5C 1F 55 5B 1F 55 5A 1F 55 59 1F 55 58 1F 55 57 1F 55 56 1F 55 55 1F 55 54 1F 55 53 1F 55 52 1F 55 51 1F 55 50 1F 55 4F 1F 55 4E 1F 55 4D 1F 55 4C 1F 55 4B 1F 55 4A 1F 55 49 1F 55 48 1F 55 47 1F 55 46 1F 55 45 1F 55 44 1F 55 43 1F 55 42 1F 55 41 1F 55 40 1F 55 3F 1F 55 3E 1F 55 3D 1F 55 3C 1F 55 3B 1F 55 3A 1F 55 39 1F 55 38 1F 55 37 1F 55 36 1F 55 35 1F 55 34 1F 55 33 1F 55 32 1F 55 31 1F 55 30 1F 55 2F 1F 55 2E 1F 55 2D 1F 55 2C 1F 55 2B 1F 55 2A 1F 55 29 1F 55 28 1F 55 27 1F 55 26 1F 55 25 1F 55 24 1F 55 23 1F 55 22 1F 55 21 1F 55 20 1F 55 1F 1F 55 1E 1F 55 1D 1F 55 1C 1F 55 1B 1F 55 1A 1F 55 19 1F 55 18 1F 55 17 1F 55 16 1F 55 15 1F 55 14 1F 55 13 1F 55 12 1F 55 11 1F 55 10 1F 55 F 1F 55 E 1F 55 D 1F 55 C 1F 55 B 1F 55 A 1F 55 9 1F 55 8 1F 55 7 1F 55 6 1F 55 5 1F 55 4 1F 55 3 1F 55 2 1F 55 1 1F 55 0 1F 55 F5 1E 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 AC 1E 55 7F 1E 55 7E 1E 55 7D 1E 55 7C 1E 55 7B 1E 55 7A 1E 55 79 1E 55 78 1E 55 77 1E 55 76 1E 55 75 1E 55 74 1E 55 73 1E 55 72 1E 55 71 1E 55 70 1E 55 6F 1E 55 6E 1E 55 6D 1E 55 6C 1E 55 6B 1E 55 6A 1E 55 69 1E 55 68 1E 55 67 1E 55 66 1E
Dim BufferByte() As Byte
Dim i As Integer
Dim CommandFlag As Integer
Dim buffer As Variant
Private Sub Command1_Click()
CommandFlag = 1
MSComm1.Output = "1"
End SubPrivate Sub Command2_Click()
CommandFlag = 0
MSComm1.Output = "0"End SubPrivate Sub Command3_Click()
Text1.Text = ""End SubPrivate Sub Form_Load()
i = 0
CommandFlag = 2
MSComm1.PortOpen = True
End SubPublic Sub MSComm1_OnComm() '接收数据触发OnComm()事件
Select Case MSComm1.CommEvent '在CommEvent中接收数据
Case comEvReceive
If CommandFlag = 0 Then
Text1.Text = Text1.Text & vbCrLf + "写55完成"
Else
buffer = MSComm1.Input '读出借收到的数据到variant变量buffer
BufferByte = buffer '存入byte型
ErroArray(i) = BufferByte(0) '将接收到的数据保存到数组中
i = i + 1 '数组索引加一
Text1.Text = Text1.Text + " " + CStr(Hex(ErroArray(i - 1))) '在文本框中显示接收到的16进制数据
DoEvents
End If
End Select
End Sub
********输出结果******************55 0 20 55 F5 1F 55 3F 55 3F 55 3F 55 3F 55 3F 55
^^^^^^^^^^
第一个是正确的
3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
这是错误的输出
3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 AC 1F 55 7F 1F 55 7E 1F 55 7D
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
从这个地方开始是正确的
1F 55 7C 1F 55 7B 1F 55 7A 1F 55 79 1F 55 78 1F 55 77 1F 55 76 1F 55 75 1F 55 74 1F 55 73 1F 55 72 1F 55 71 1F 55 70 1F 55 6F 1F 55 6E 1F 55 6D 1F 55 6C 1F 55 6B 1F 55 6A 1F 55 69 1F 55 68 1F 55 67 1F 55 66 1F 55 65 1F 55 64 1F 55 63 1F 55 62 1F 55 61 1F 55 60 1F 55 5F 1F 55 5E 1F 55 5D 1F 55 5C 1F 55 5B 1F 55 5A 1F 55 59 1F 55 58 1F 55 57 1F 55 56 1F 55 55 1F 55 54 1F 55 53 1F 55 52 1F 55 51 1F 55 50 1F 55 4F 1F 55 4E 1F 55 4D 1F 55 4C 1F 55 4B 1F 55 4A 1F 55 49 1F 55 48 1F 55 47 1F 55 46 1F 55 45 1F 55 44 1F 55 43 1F 55 42 1F 55 41 1F 55 40 1F 55 3F 1F 55 3E 1F 55 3D 1F 55 3C 1F 55 3B 1F 55 3A 1F 55 39 1F 55 38 1F 55 37 1F 55 36 1F 55 35 1F 55 34 1F 55 33 1F 55 32 1F 55 31 1F 55 30 1F 55 2F 1F 55 2E 1F 55 2D 1F 55 2C 1F 55 2B 1F 55 2A 1F 55 29 1F 55 28 1F 55 27 1F 55 26 1F 55 25 1F 55 24 1F 55 23 1F 55 22 1F 55 21 1F 55 20 1F 55 1F 1F 55 1E 1F 55 1D 1F 55 1C 1F 55 1B 1F 55 1A 1F 55 19 1F 55 18 1F 55 17 1F 55 16 1F 55 15 1F 55 14 1F 55 13 1F 55 12 1F 55 11 1F 55 10 1F 55 F 1F 55 E 1F 55 D 1F 55 C 1F 55 B 1F 55 A 1F 55 9 1F 55 8 1F 55 7 1F 55 6 1F 55 5 1F 55 4 1F 55 3 1F 55 2 1F 55 1 1F 55 0 1F 55 F5 1E 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 3F 55 AC 1E 55 7F 1E 55 7E 1E 55 7D 1E 55 7C 1E 55 7B 1E 55 7A 1E 55 79 1E 55 78 1E 55 77 1E 55 76 1E 55 75 1E 55 74 1E 55 73 1E 55 72 1E 55 71 1E 55 70 1E 55 6F 1E 55 6E 1E 55 6D 1E 55 6C 1E 55 6B 1E 55 6A 1E 55 69 1E 55 68 1E 55 67 1E 55 66 1E
以下是我的几点心得希望对大家有用:1。请确认你的单片机的晶振是多少?或者仿真器是多少?2。我从我的老师(单片机老手)哪里知道目前的仿真器多多少少在通讯方面有些不知原因的错误,故最好是通过烧芯片!!!3。不同的晶振,允许的波特率是不一样的。4。由于PC机与单片机的信号是不一样,请想办法处理。
还有8MHZ的单片机可以在9600的波特率下工作吗?你最好查一下8MHZ的波特率使用范围!?
对于很多数据波特率不能设得太高,而且一定要有一定的延时。此外,在VB中一定要清空BUFFER,即MSCOMM1.BUFFERCOUNT=0 ,而且数据要用二进制接收!!!
单片机的延时已经考虑.每个数据的发送都加了足够延时
另外请把你的单片机程序让我们看一下??
2、二进制方式接收
redim bufferbyte(3)
If CommandFlag = 0 Then
Text1.Text = Text1.Text & vbCrLf + "写55完成"
Else
bufferbyte = MSComm1.Input
ErroArray(i) = BufferByte(0) '将接收到的数据保存到数组中
i = i + 1 '数组索引加一
Text1.Text = Text1.Text + " " + CStr(Hex(ErroArray(i - 1)))
' DoEvents //如果接受速度快,应该去掉
End If