关于这个主题,在CSDN和GOOGLE上已经有很多帖子讨论了.我参考了这些帖子.发现基本是这样来处理的,首先定义
Dim Buffer as Variant 用来存储收到的二进制数据.
这样定义的原由是因为MSDN告诉我们,Input返回的是一个Variant类型的字节数组.我有可能翻译的有问题,下面是原文:
If InputMode is comInputModeBinary then the Input property returns binary data in an array of bytes in a Variant.
然后就是处理.
下面说下我的疑问:
1.是否应该这样定义:
Dim Buffer(100) as Variant
即定义一个这样的数组,然后
Buffer(k) = Mscomm.Input
k = k+1
假设需要接受100个字节数据我将RThreshold设定为一,从而到达一个字节数据,就会引发接收事件
这样,接受事件会被触发100次.
然后我就考虑处理Buffer(100)中的数据
我这样来处理
Dim receive(100) as Byte
Dim i as Integer
For i = 0 to 99
receive(i) = CByte(Buffer(i))
Next
我的目的就是得到那些字节
但这样是失败的.
我考虑到出现这样的情况,基本是因为我没有理解Mscomm控件的工作方式.
我参考过一些书,有大陆的,有台湾的
还有这样的方法
Dim Buffer() as Byte
.......
'接受
........
Buffer = Mscomm.Input
这是本台湾人写的书上的方法,我没有具体写出.
但我本人太过于愚笨,一直无法领悟各位高手的讲解..
我不知道如何才可以以二进制模式接受数据并正确处理
我自己觉得很自然的是这样来:
Dim Receive(100) as Byte
.......
接受数据
Receive(i) = Mscomm.Input
但这样错误,下面附上我用串口精灵截获的从单片机发给PC机的数据
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 04 04 04 04 04 04 04 A5 A5 A5 A5 A5 A5 A5 A5
请各位大哥给小弟指一条路.
Dim Buffer as Variant 用来存储收到的二进制数据.
这样定义的原由是因为MSDN告诉我们,Input返回的是一个Variant类型的字节数组.我有可能翻译的有问题,下面是原文:
If InputMode is comInputModeBinary then the Input property returns binary data in an array of bytes in a Variant.
然后就是处理.
下面说下我的疑问:
1.是否应该这样定义:
Dim Buffer(100) as Variant
即定义一个这样的数组,然后
Buffer(k) = Mscomm.Input
k = k+1
假设需要接受100个字节数据我将RThreshold设定为一,从而到达一个字节数据,就会引发接收事件
这样,接受事件会被触发100次.
然后我就考虑处理Buffer(100)中的数据
我这样来处理
Dim receive(100) as Byte
Dim i as Integer
For i = 0 to 99
receive(i) = CByte(Buffer(i))
Next
我的目的就是得到那些字节
但这样是失败的.
我考虑到出现这样的情况,基本是因为我没有理解Mscomm控件的工作方式.
我参考过一些书,有大陆的,有台湾的
还有这样的方法
Dim Buffer() as Byte
.......
'接受
........
Buffer = Mscomm.Input
这是本台湾人写的书上的方法,我没有具体写出.
但我本人太过于愚笨,一直无法领悟各位高手的讲解..
我不知道如何才可以以二进制模式接受数据并正确处理
我自己觉得很自然的是这样来:
Dim Receive(100) as Byte
.......
接受数据
Receive(i) = Mscomm.Input
但这样错误,下面附上我用串口精灵截获的从单片机发给PC机的数据
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 04 04 04 04 04 04 04 A5 A5 A5 A5 A5 A5 A5 A5
请各位大哥给小弟指一条路.
1)Dim Buffer(100) as Variant 这样定义错误
2)我将RThreshold设定为一,从而到达一个字节数据,就会引发接收事件.这样,接受事件会被触发100次.
不是如你所说被触发100次,仅17次
Option Explicit
Dim strData As StringPrivate Sub MsComm1_OnComm()
Dim inByte() As Byte
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive
inByte = MSComm1.Input
For i = 0 To UBound(inByte)
If Len(Hex(inByte(i))) = 1 Then
strData = strData & "0" & Hex(inByte(i))
Else
strData = strData & Hex(inByte(i))
End If
Next
'以下写符合通信协议规定的判断代码处理接收数据
If Len(strData) = 200 Then '接收100字节数据
Text1.Text = strData
strData = ""
End If
End Select
End SubPrivate Sub Form_Load()
With MSComm1
.CommPort = 1
.Settings = "9600,n,8,1"
.InBufferCount = 0
.InputLen = 0
.RThreshold = 1
.InputMode = comInputModeBinary '以2进制接收
.PortOpen = True
End With
Text1 = ""
End Sub请看我的BLOG
http://blog.csdn.net/zdingyun/archive/2008/09/23/2969936.aspx
.......
'接受
........
Buffer = Mscomm.Input
这种方法实际上是把Mscomm接收缓存里的所有数据读出来并保存到Buffer数组中,Buffer数组的大小由Mscomm接收缓存实际缓存的数据量决定,因为Mscomm的接收缓存里实际的数据量是不确定的,所以不能使用
Dim Receive(100) as Byte
.......
接受数据
Receive = Mscomm.Input
这样的方式。Dim Receive(100) as Byte
.......
接受数据
Receive(i) = Mscomm.Input
这样是可以的,这样实际上是一次从Mscomm的接收缓存里读一个字节的数据,你这样做不行估计是因为数据传输速率和RThreshold设定的问题,因为赋值语句运行的时间要远比串口传输速率快很多倍,所以你必须等Mscomm的接收缓存里有100个字节以上的数据时你才能通过循环用Mscomm.Input依次读出100个字节的数据,否则就肯定会出错,所以如果你把RThreshold设定为100,也就是每收到100个字节的数据触发一次OnComm事件就可以通过Receive(i) = Mscomm.Input把数据读出来。