MSComm1.RThreshold = 1                      '产生MSComm事件Public Sub MSComm1_OnComm()
             
  Select Case MSComm1.CommEvent     Case comEvReceive
        
      MSComm1.InputLen = 10
         
     Debug.Print MSComm1.InBufferCount
     
     Dim Buffer As Variant
           
     Do
       DoEvents
                                          
           Buffer = MSComm1.Input
           
           data_in_str = Buffer
           
       '   Debug.Print Len(data_in_str)
        
                     
       Loop Until (MSComm1.InBufferCount >= 10)
       
       Call AllData
      
    Case Else
    
  End Select
  
  date_in_str = ""End Sub1 MSComm1.InBufferCount 一次给的大于10时,有时80,有时90,好像只能读一次
2 MSComm1.InBufferCount 一次给的小于10时,有时 2 ,好像丢了
大家遇到这种情况,一般都怎么处理?

解决方案 »

  1.   

    属性设置错误:应该设置RThreshold'1.CommPort:设置或返回串行端口号,其取值范围为1~16,缺省为1。
    '2.Setting:设置或返回串行端口的波特率、奇偶校验位、数据位数、停止位。如:M scomm.Setting="9600,N,8,1"。
    '3.PortOpen:打开或关闭串行端口,格式为:Mscomm.PortOpen={TRUE|FALSE}。
    '4.InBufferSize:设置或返回接收缓冲区的大小,缺省为1024字节。
    '5.InBufferCount:返回接收缓冲区内的等待读取的字节个数,可通过设置该属性为0来清除接收缓冲区。
    '6.RThreshold:该属性为一阀值,它确定当接收缓冲区内字节个数达到或超过该值后就产生代码为MSCOMM_EV_RECEIVE的OnComm事件。
    '7.InputLen: 设置或返回接收缓冲区内用Input读入的个数。若取0,则INPUT读取整个缓冲区的内容。
    '8.Input: 该属性表示从接收缓冲区返回并移走一串字符。
    '9.OutBufferSize:设置或返回发送缓冲区,缺省为512字节。
    '10.OutBufferCounter:返回发送缓冲区内等待发送的字符数,可用来清空缓冲区。
    '11.Output:向发送缓冲区传送一字符串。
    '12.EOFEnable:若置TRUE,则当输入中出现EOF,就停止输入并产生OnComm事件。
    '13.Handshaking:设置并返回硬件握手协议。用于异步通信的速度匹配。'
    'Handshaking 是指内部通信协议,通过该协议,数据从硬件端口传输到接收缓冲区。当一个数据字符到达串行端口,通信设备就把它移到接收缓冲区以使程序可以读它。如果没有接受缓冲区,程序需要直接从硬件读取每一个字符,这很可能会造成数据丢失,因为字符到达的速度可以非常快。握手协议保证在缓冲区过载时数据不会丢失,缓冲区过载为数据到达端口太快而使通信设备来不及将它移到接收缓冲区。
    '如果在通信过程中发生错误或事件 , 就会引发OnComm事件并且改变属性值, 由CommEvent属性代码反映错误类型, 在通信程序的设计中可根据该属性值来执行不同的操作, 以下是部分属性常数值及其含义:
    '1.ComEvSend: 其值为1,发送缓冲区的内容少于SThreshold指定的值。
    '2.ComEvReceive: 其值为2,接收缓冲区内字符数达到 RThreshold 值,该事件在缓冲区中数据被移走前将持续产生。
    '3.ComEventFrame: 其值为1004,硬件检测到帧错误。
    '4.ComEventRxOver: 其值为1008,接收缓冲区溢出。
    '5.ComEventTxFull: 其值为1010,发送缓冲区溢出。
    '6.ComEventRxParity: 其值为1009,奇偶校验。
    '7.ComEvEOF: 其值为7,接收数据中出现文件结束(ASCII 码为 26)字符
      

  2.   

    MSComm1.InBufferCount 不用设置,在接收字符串中就有本次结束的字符(一般通讯协议中都有结束字符的)。
    判断接收字符串中是否含有结束字符,若有则认为接收到完整的信息,反之则否。这样对于接收信息的完整性和准确性能就有一定的保障。