关于这个主题,在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
请各位大哥给小弟指一条路.

解决方案 »

  1.   

    LZ:
    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 
      

  2.   

    Dim Buffer as Variant 表示声明了一个Buffer变量,但是这个Buffer变量的类型不确定,可以是Long、Integer、Double、Object、String以及数组等等,Buffer变量的类型由编译器自行判断与转换。Dim Buffer(100) as Variant 表示声明了一个数组Buffer,该数组有100个成员,数组的每一个成员都没有指定具体的数据类型,由编译器自行判断与转换Dim receive(100) as Byte 表示声明了一个数组receive,该数组有100个成员,数组的每一个成员都是Byte型。Dim Buffer() as Byte 表示声明了一个数组Buffer,该数组成员数目未知,数组的每一个成员都是Byte型。在确定数组成员数量之前是不能通过Buffer(xx)的这种方式访问Buffer里的成员的。Dim Buffer() as Byte 
    ....... 
    '接受 
    ........ 
    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把数据读出来。