该控件有两个属性我有疑问,分别是 InputLen 和 Rthreshold ,我也看了很多资料,今天也编了了个程序验证了下,感觉不太理解,拿第二个为例,书上说是当其为0时,不论接收到了多少数据,都不会触发OnComm事件,我验证了 OK!,确实是那样,但是当我设为1时,书上说是系统每收到1个数据就会触发OnComm,我的发送程序是个循环,只要按一下发送按钮,就会一次性发送出去64个数据,是一个BYTE型数组,下位机是单片机,单片机是把收到的电脑数据原封不动返回,下位机程序是没有问题的,我用串口调试助手验证过。现在问题是,当我设Rthreshold 为1,InputLen 为0时,在OnComm事件中,为什么执行 num = MSComm.inbuffercount 后,我在调试中发现 num为64?既然收到一个数据就要触发一次,不是应该连续触发64次,每次监控到的Num都是1吗?求解释VB串口控件控件

解决方案 »

  1.   

    第一个问题:
    InputLen属性是表示MScomm控件每执行一次MSComm1.Input所最多能够从接收缓冲区中读取的字节的数量,如果为1,那么每次就读取一个,为2就是2个,....100个就是每次最多能够读取100个,当然这个前提条件是接收缓冲区中要有足够的字节可读取。读取一次,就从接收缓冲区中清除掉这些字节打个比方,如果你的串口接收缓冲区中有50个字节,InputLen=4,那么每执行一次Input,就读取4个字节,如此反复执行12次,读取了48个字节,此时串口缓冲区还有两个字节,当第十三次读取接收缓冲区时,就只能读取两个了。
    需要特别说明的是,当设置InputLen=0时,表示执行Input时,一次性清空接收缓冲区,也就是有多少读多少。
    第二个问题:
    Rthreshold属性设置为:0表示当串口接收到数据时,不触发OnComm事件,当设置非0时,就是当接收缓冲区每接收到这么多个字节时就触发一次OnComm事件。一般情况下,在Rthreshold不等于0的情况下,处理接收数据的代码都放在OnComm事件中。请参考:
    http://download.csdn.net/detail/veron_04/1262066
    http://download.csdn.net/detail/veron_04/3601715
      

  2.   

    Rthreshold = 1 并不意味着每接收一个字节都触发 OnComm 事件。而是,只要接收到 1 个字节就触发 OnComm 事件。而且,传输也不因为进入了 OnComm 事件处理而停止。你能分清两者之间的区别吧?
      

  3.   

    我的习惯是,当触发了Oncomm事件后,进入事件处理中,将Rthreshold=0,也就是在本次处理过程中不触发OnComm事件,加以适当的延迟,一般一次串口通信也就触发一次OnComm事件。当然,一定记得在处理完后一定要恢复:Rthreshold=1
      

  4.   


    说的很好,确实,传输并不因进入了OnComm 事件而停止,我之前一直用的是MCU,所以有思维定势了。。
      

  5.   


    在网上下载了一个温度采集系统VB工程,其中有一段表格初始化代码:
    '-----------------------------------------------
    '    数据表格初始化
    '-----------------------------------------------
    Public Sub tabinit()    Grid.Cols = 2                                   ' 两列
        Grid.Rows = Txttimes.Text + 1                   ' Rows 的值必须至少比 FixedRows 的值大一
        Grid.ColWidth(0) = 650                          ' 设置表格宽度
        Grid.ColWidth(1) = 850
        Grid.Col = 0
        
        For i = 1 To Txttimes.Text
            Grid.Row = i
            Grid.Text = "  " + Str$(i)
        Next i
        
        Grid.Row = 0
        Grid.Col = 0: Grid.Text = " 序号"
        Grid.Col = 1: Grid.Text = " 温度值"
        Grid.TopRow = 1                                 '置在第一页
        Grid.LeftCol = 1

        
    End Sub想问问:Grid.TopRow = 1  Grid.LeftCol = 1 这是什么意思?原作者的注释我看不懂
      

  6.   

    TopRow 和 LeftCol 表示有滚动的情况下可见的左上角单元。
    Grid.TopRow = 1  Grid.LeftCol = 1 就是滚动到第一行第一列。