VB接受上位机的数据,第一次总是少一位

VB接受下位机的数据,第一次总是少一位
下位机给上位机串口发数据:发送多次每次15个字节
第一次发送,上位机只能收到14个,第二次发送,上位机就会收到第一次发送的最后一个数据,但是能收到15个,最后一个还是收不到
我用串口工具测试,能完整收到下位机发送的数据比如:我发送1-15的数据
第一次上位机只能收到1-14  
第二次在发送,上位机能收到 15 1 2 。。。14
希望高手解答,万分感谢!!!!!!
VB串口初始化:
VB code
MSComm1.Settings = "9600,N,8,1"
  MSComm1.PortOpen = True
  MSComm1.RThreshold = 1

Private Sub MSComm1_OnComm()
  Dim j As Integer
  Dim lennow As Integer
  Dim InByte() As Byte '存储数据的缓冲区'定义一个二进制指针放接收到的数据

  Select Case MSComm1.CommEvent '选择事件
  Case comEvReceive '接收到字符
    
  'Timer4.Enabled = False
  InByte() = MSComm1.Input '数据转移到指针
  lennow = UBound(InByte) + 1

  If lennow > 0 Then
  For j = 0 To lennow - 1
  'recdata(lencount + j) = InByte(j)
  recdata(j) = InByte(j)
  Text1.Text = Text1.Text & recdata(j)
  Next j
  'lencount = lencount + lennow
  End If
    
  j = 0
  If lennow = 15 Then
  If recdata(2) = &HE1 Then
  For j = 0 To 3
  If PicCD(j).Visible = False Then
  TIRec(j) = recdata(0)
  Exit For
  End If
  Next
    
  If j > 3 Then
  MsgBox "最多同时操作4股道!"
  Call SendData(recdata(0), &H55)
  End If
    
  End If
    
  For j = 0 To 3
  If TIRec(j) = recdata(0) Then
  Call DataAnalysis(recdata, j)
  Exit For
  End If
  Next
  'lencount = 0
    
  lennow = 0
  'Timer4.Enabled = True
  End If

  Case comEventRxOver '接收缓冲区满的处理
  MsgBox "接收缓冲区满了!" '发出警告
  End Select
End Sub   


串口初始化:
C/C++ code
void serial_scon_receive()
{
  TR1=0 ;
  TCON=0xC0 ;
  SCON=0x50 ;
  TMOD=0x20;
  TH1=0xfd ;
  TL1=0xfd ; //FD:9.6K; FA:4.8K; F4:2.4K
  PCON=0x00 ;

  ES=1 ;
  //串口中断使能
  PS=1 ;
  EA=1 ;
  TR1=1 ;
}
下位机串口发送:
for(i=0; i<15; i++)
  {
  TR1 = 1;
  uart_r = 0;
  SBUF = pBuf[i];
  while(uart_r==0)
  {
  _nop_();;
  }
  }


希望哪位高手指点,万分感谢
急需呀

------解决方案--------------------
你认为一个数据帧是15位,但是InByte() = MSComm1.Input不能保证这个时候输入缓冲区是15位。

即使输入缓冲区里面只有一个数据也会产生oncomm事件。实际可能是,输入缓冲区已经有一个数据了,产生了oncomm事件,你的程序开始读取数据,在读取的时候读取的数据还没有够到15个。

以前做一个程序,我是先把缓冲区的数据放在自己的缓冲区,自己的缓冲区超过15个数据才开始自己处理数据,并把处理的数据移出缓冲区。
要是每个数据帧都是15位,那应该等够15位了再处理。
------解决方案--------------------
你已经设置MSComm1.RThreshold = 1,那么每接收一个字节就会产生oncomm事件。
InBufferCount属性返回缓冲区内的未处理数据

所以在 Case comEvReceive '接收到字符 后面添加
if mscomm1.InBufferCount<16 then exit sub

计算机没串口,没实验