请问 vb mscoom 通讯为题

请教 vb mscoom 通讯为题
当上位机(电脑软件)与下位机(单片机)通讯时,上位机总不能将下位机发送的数据(十六进制)全部接受,每次通讯数据量在10万以下,vb的 mscoom控件的InBufferSize属性的最大值为32767,大于此值可能会溢出,但奇怪的是当小于此值时也会丢,请问丢哪里了,期待赐教!!!
以下是电脑软件程序的部分代码:

Private Sub Comm_OnComm()
  Dim IntR as integer
  Static Resv As Variant '接收数据
  Static DataC As Long '串口数据字节数
  Static CTestData() As Byte'用于存放接受的字符
  Static FactCount As Long '累计实际接收的数据
  static TestFlag Boolean'实验结束标志
  TestFlag = false
  Comm.RThreshold = 0 
  FactCount = 0
  DataC = Comm.InBufferCount: Resv = Comm.Input  
  ReDim CTestData(100000)
  For IntR = 0 To DataC - 1
  CTestData(IntR) = Resv(IntR)
  FactCount = FactCount + 1
  Next IntR
   
  Static CurrTime As Long '等待时间
  CurrTime = GetTickCount
  '一直接受数据,直到接受完成为止 
  do  
  If Comm.InBufferCount >= 1000 Or Abs(GetTickCount - CurrTime) >= 100 Then
  CurrTime = GetTickCount 
  DataC = Comm.InBufferCount: Resv = Comm.Input
  For IntR = 0 To DataC - 1
  CTestData(FactCount) = Resv(IntR)
  FactCount = FactCount + 1  
  DoEvents
  Next IntR
  End If
  DoEvents
  Endif
  Do While Comm.InBufferCount = 0 '无数据则测试结束
  debug.print "实验结束"
  TestFlag = ture
  Exit Do
  Loop
  if TestFlag then Exit do
   
Exit Sub






------解决方案--------------------
嘿嘿 的确是发重了
对于通信质量要求高或者数据量偏大的应用,不建议用 Comm_OnComm()
建议:
用双Timer实现。一个管收数据,一个管发数据。建立自己的缓冲区,不间断的接收所有的数据,知道发送端发送完毕。
------解决方案--------------------
试一试这个,看看有没有丢失信息的情况,如果没有,依照这个代码写自己的程序即可。
http://download.****.net/source/1262066
------解决方案--------------------
初学串口通讯,望大家多多指教,请问用多线程解决会不会好些?
------解决方案--------------------
具体点?那就给你看一段简单的单片机串口通讯时的处理过程吧
C/C++ code

void COM_Event () interrupt 4 
{   
    unsigned char dat        = 0;
    unsigned char NXorData    = 0;
    if(RI == 1){
        //接收数据 SBUF 为单片机的接收发送缓冲寄存器
        dat = SBUF;
        RI = 0;
        // 这里分析你收到的信息,同事可做出反应
        switch(CApproach){
        case 0:    // 数据包头
                if(dat==0xB2){
                     CApproach = 1;
                }
                break;
        case 1:    // 机号
                if(dat==MyNumber){
                     CApproach = 2;
                }else{
                     CApproach = 0;
                }
                break;
        case 2:    // 命令
                if(dat>=1&&dat<=7){
                     CCommand = dat;
                     CApproach = 3;
                }else{
                     CApproach = 0;
                }
                break;
        case 3:    // 命令参数
                switch(CApproach){
                case 1:    // 探测设备命令,无参数
                        CXorCount = dat;
                        CApproach = 255;
                        break;
                case 2:    // 开启通讯监视,无参数
                        CXorCount = dat;
                        CApproach = 255;
                        break;
                case 3:    // 关闭通讯监视,无参数
                        CXorCount = dat;
                        CApproach = 255;
                        break;
                default:
                        CApproach = 0;
                        break;
                }
                break;
        case 255:    // 接收包尾
                if(dat==0xB3){
                    switch(CCommand){
                    case 1:    // 探测设备命令需要进行异或校验
                            NXorData = 0xB2;
                            NXorData = NXorData^MyNumber;
                            NXorData = NXorData ^ CCommand;
                            if(NXorData==CXorCount){
                                SendBufToPort("LTC-20100409A",13);
                            }else{
                                CApproach = 0;
                            }
                            break;
                    case 2:    // 开启通讯监视命令需要进行异或校验
                            NXorData = 0xB2;
                            NXorData = NXorData^MyNumber;
                            NXorData = NXorData ^ CCommand;
                            if(NXorData==CXorCount){
                                AddMinute = 0;
                                AddSecond = 0;
                                AddMillisecond = 0;
                                AddMicrosecond = 0;
                                Approach = 1;

                                SendBufToPort("Open stakeout.",14);
                            }else{
                                CApproach = 0;
                            }
                            break;
                    case 3:    // 关闭通讯监视命令需要进行异或校验
                            NXorData = 0xB2;
                            NXorData = NXorData^MyNumber;
                            NXorData = NXorData ^ CCommand;
                            if(NXorData==CXorCount){
                                Approach = 0;
                                AddMinute = 0;
                                AddSecond = 0;
                                AddMillisecond = 0;
                                AddMicrosecond = 0;
                                SendBufToPort("Close stakeout.",14);
                            }else{
                                CApproach = 0;
                            }
                            break;
                    default:
                            CApproach = 0;
                            break;
                    }
                }else{
                    CApproach = 0;
                }
                break;
        }
    }else{
        TI    =    0;
    }

}