只讨论接收:
.CommPort = 1 '设置Com1为通信端口
.Settings = "921600,N,8,1"
.InBufferSize = 4096 '设置缓冲区接收数据为40字节
.InputLen = 1 '设置Input一次从接收缓冲读取字节数为1
.RThreshold = 1 '设置接收一个字节就产生OnComm事件
大概一秒产生10个ONCOMM事件,数据没有错,而且按照这样的速率,数据丢失会很严重,事实刚好相反,比较长事件才会出现溢出。.Settings = "9600,N,8,1"
.InBufferSize = 4096 '设置缓冲区接收数据为40字节
.InputLen = 1 '设置Input一次从接收缓冲读取字节数为1
.RThreshold = 1 '设置接收一个字节就产生OnComm事件
以为是波特率的问题,调低了,没变化.Settings = "9600,N,8,1"
.InBufferSize = 128 缓冲区接收数据为40字节
.InputLen = 128 置Input一次从接收缓冲读取字节数为1
.RThreshold = 1 '设置接收一个字节就产生OnComm事件
把缓冲区和INPUTLEN都改了一个接近的数字,产生事件的速度上去了,大概有1秒50个。其他实验不写了,大概是这样:ONCOMM事件的发生速度与RTHRESHOLD的值好像没有太大关系,对于第一种情况,我1到1000都尝试过了。
ONCOMM事件里面,如果加入TEMP()=MSCOMM1.INPUT,速度反而会上去。奇怪因为要做实时的控制,所以刷新率很重要,高手帮帮忙,最好能够详细说说几个属性的意义和用法!

解决方案 »

  1.   

    建议LZ使用MSComm 控件属性InputLen 属性的缺省设置0
    InputLen 属性的缺省值是 0。设置 InputLen 为 0 时,使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。
    工业实时的控制中这是通常的用法。
    此外:
    你的
    .Settings = "921600,N,8,1",MSComm 控件没有921600波特率。
    .InBufferSize = 4096 '设置缓冲区接收数据为40字节 ,这句是设置并返回接收缓冲区的字节数,应该是4096字节,其缺省设置值是 1024 字节。
      

  2.   

    1、921600实测是可以正确接收数据的。
    2、笔误
    3、问题关键在于我将RTHRESHOLD设成1后,为什么ONCOMM事件仍然这么慢(1秒十个)?
    9600BPS=1200BYTE PER SECOND,应该一秒钟会产生1200个ONCOMM事件啊
      

  3.   

    1位起始位,8位数据位,无校验位,1位停止位,9600波特率,理论上每秒可收或发960字节数据,不是1200字节。
    你的问题在于设置了InputLen 属性为,这样每次1字节触发1次OnComm事件。如果设置InputLen 为0,当RTHRESHOLD设成1后,
    接收1-8字节,产生1次OnComm事件
    接收9-16字节,产生2次OnComm事件
    接收17-24字节,产生3次OnComm事件

    接收41-48字节,产生6次OnComm事件
    这是可以测试的。
      

  4.   

    换了一个机器,问题不见了,郁闷啊~~~~~
    我的主要问题是RECEIVE事件,即使我把RTHRESHOLD,在有问题的机器上,顶多就一秒50个RECEIVE事件,WHY!!!!????
    PS:新的机器是直接用COM链接的,原来的那个是ARM->USB->驱动程序变COM->MSCOMM32
      

  5.   

    那是USB硬件与你代码设置共同引起的,硬件为主.