当inputbufffer设置为多个字节比如30的时候
系统会自动把接收的数据一次放入缓冲区吗?
如何正确读取缓冲区中的数据?

解决方案 »

  1.   

    不是的,系统仍然会一个字节一个字节的放入缓冲区。inputbufffer值的大小觉得了触发MScomm的onComm事件,当缓冲区的字节大小为inputbufffer的值时,触发MScomm的onComm事件,实现数据的接收
      

  2.   

    1、PC是逐个位接收,拚成字符后把它放到接收缓冲区。
    InBufferSize——是指整个接收缓冲区的大小;
    InBufferCount——是指已接收并在接收缓冲区等待被取走的字符数;2、要接收信息,除了要设置好CommPort、Settings、PortOpen的值外,还要注意:
    InputLen——从接收缓冲区读取的字符数;
    InputMode——设置取回的格式是字符串或是二进制数据;
    Rthreshold——指出收到多少个字符后,引起OnComm 事件。
      

  3.   

    Wenking003(文君) 说得很清楚了  
       1、PC是逐个位接收,拚成字符后把它放到接收缓冲区。
    InBufferSize——是指整个接收缓冲区的大小;
    InBufferCount——是指已接收并在接收缓冲区等待被取走的字符数;2、要接收信息,除了要设置好CommPort、Settings、PortOpen的值外,还要注意:
    InputLen——从接收缓冲区读取的字符数;
    InputMode——设置取回的格式是字符串或是二进制数据;
    Rthreshold——指出收到多少个字符后,引起OnComm 事件。
    你要把数组定义为byte
    pc窜口本来就是一个一个字节得发得,同一时间不可能发2个字节 
      

  4.   

    看一下我的程序,我现在给上位机发送数据,可以接受到末尾的22个字节,前面的12个字节接受不到,是怎么回事啊...
    Private Sub CmdExit_Click()
      Unload Me
    End SubPrivate Sub CmdSend_Click()
    '...发送  Dim i As Integer
      Dim start_data(0) As Byte 
      Dim data(4) As Byte   
      Dim data1(0) As Byte   
      Dim data2(0) As Byte   
      Dim data3(0) As Byte   
      Dim data4(0) As Byte   
      Dim end_data(0) As Byte   
      Dim pf_send(0) As Byte      pf_send(0) = 0
      start_data(0) = &HAA
      For i = 0 To 3
        data(i) = CVar(CBCD(CByte(TxtNum(i).Text)))
        pf_send(0) = pf_send(0) Xor data(i)
      Next i
      end_data(0) = &H55
      pf_send(0) = pf_send(0) Xor end_data(0)
      data1(0) = data(0)
      data2(0) = data(1)
      data3(0) = data(2)
      data4(0) = data(3)
      MSComm1.CommPort = 2   
      MSComm1.PortOpen = True   
      MSComm1.OutBufferCount = 0    
      MSComm1.Output = start_data   '发送数据
      MSComm1.Output = data1
      MSComm1.Output = data2
      MSComm1.Output = data3
      MSComm1.Output = data4
      MSComm1.Output = end_data
      MSComm1.Output = pf_sendEnd SubPrivate Sub Form_Load()
     
      MSComm1.Settings = "9600,n,8,1" End SubPrivate Sub MSComm1_OnComm()  Dim indata As Variant
      Dim bte(0) As Byte  Select Case MSComm1.CommEvent
        Case comEvReceive   
          MSComm1.RThreshold = 0  
          indata = MSComm1.Input   '接受下位机的应答信号
          MSComm1.InBufferCount = 0   
          bte(0) = AscB(indata)
          
          If bte(0) = &H0 Then    '如果确认成功,启动timer,等待下位机完成34字节数据发送
            Timer1.Enabled = True 
          End If
      End SelectEnd SubPrivate Sub Timer1_Timer()
      
      Dim pf As Byte    
      Dim indata() As Byte
      Dim bte(34) As Byte
      Dim i As Integer
      
      
      Timer1.Enabled = False
      
      pf = 0
      indata = MSComm1.Input    '接受34字节数据
      For i = 0 To 33
        bte(i) = CB(indata(i))
        pf = pf Xor bte(i)
      Next
      MSComm1.OutBufferCount = 0 
      
      'If pf = bte(33) Then  
       ' MSComm1.Output = &H0  
      '  For i = 0 To 3
      '    TxtNum(i).Text = CB(bte(i + 3))  
      '  Next
      'Else  '...D£?é′í?ó
      '  MSComm1.Output = &HFF   
      '  MSComm1.InBufferCount = 0   
      '  Timer1.Enabled = True   
      'End IfEnd Sub
      

  5.   

    indata = MSComm1.Input   '接受下位机的应答信号
    这个答应得信号 和下位机发送的34位信息在同一帧   还是怎么样的