我通过VB的MSCOMM控件接收51单片机上发来的数据,不知道为什么最多只能接收8个字节,请问如何接收8个以上字节?

解决方案 »

  1.   

    用oncome事件触发,设置 Sthreshold 属性为 1,当传输缓冲区完全空时,MSComm 控件产生 OnComm 事件
      

  2.   

    你可以把程序登陆出来分析一下,一般上位机先给下位机发命令后清除缓冲区延时一会儿再读取数据.有现成的例子   [email protected]
      

  3.   

    楼主 你最好 贴代码  还有MSCOMM的设置  才能知道怎么回事啊
      

  4.   

    RThreshold 属性
          在 MSComm 控件设置 CommEvent 属性为 comEvReceive 并产生 OnComm 之前,设置并返回的要接收的字符数。语法object.Rthreshold [ = value ]Rthreshold 属性语法包括下列部分:部分 描述 
    object 对象表达式,其值是“应用于”列表中的对象。 
    value 整型表达式,说明在产生 OnComm 事件之前要接收的字符数。 
    说明当接收字符后,若 Rthreshold 属性设置为 0(缺省值)则不产生 OnComm 事件。例如,设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。数据类型Integer
    InBufferSize 属性
          设置并返回接收缓冲区的字节数。语法object.InBufferSize[ = value ]InBufferSize 属性语法包括下列部分:部分 描述 
    object 对象表达式,其值是“应用于”列表中的对象。 
    value 整型表达式,说明接收缓冲区的字节数。 
    说明InBufferSize 是指整个接收缓冲区的大小。缺省值是 1024 字节。不要将该属性与 InBufferCount 属性混淆,InBufferCount 属性返回的是当前在接收缓冲区中等待的字符数。注意   接收缓冲区越大则应用程序可用内存越小。但若接受缓冲区太小,若不使用握手协议, 就可能有溢出的危险。一般的规律是,首先设置一个 1024 字节的缓冲区。如果出现溢出错误,则通过增加缓冲区的大小来控制应用程序的传输速率数据类型Integer
      

  5.   

    Private Sub MSComm1_OnComm()
    On Error Resume Next
    Static id_array(0 To 5000) As Double
     Select Case MSComm1.CommEvent
       Case comEvReceive   ' 收到 RThreshold # of
          read_len = MSComm1.InBufferCount
          ReDim read_in(read_len) As Byte
          read_in = MSComm1.Input
          MsgBox read_len
     End Select
    MSComm1.InBufferCount = 0   '接收缓冲区清空
    End Sub
    Rthreshold 和Sthreshold属性设的都是1
      

  6.   

    你的代码有问题?? 你单片机发上来的数据每次的长度是不是一定的呢??
    有没有什么固定的协议??
    Rthreshold=1 应该每接收到一个字节都产生一次 oncomm
    read_len = MSComm1.InBufferCount 应该等于1
    也有可能是你以前没有接收到残留在缓冲区里面所以大于1
    你的inputlen 设置位多少??
      

  7.   

    如果用MSComm1_OnComm()事件进行接收,你必须先进行一段延时,否则不行!
    最好用循环语句来进行判断数据接收量,这种方法很好,我一直使用挺可靠的!
      

  8.   

    inputlen设的是0,也设过10和更高,都一样。
    怎么用循环语句判断数据接收量?能给个小例子吗?谢谢。
      

  9.   


            RThreshold  改成 10
            你看有什么效果啊
      

  10.   

    哈,把RThreshold  改成 10可以了,收到了14个字节。可以讲一下是什么原理吗?为什么改这个属性就可以了?