各位大虾好。
最近做一个程序,基本都是采用串口采集仪表的程序,一共用了5个COM口,我使用了Timer控件来采集,感觉采集的速度比较慢,请问有什么好方法吗?而且在数据采集的时候如果操作画面,比如按按钮的话反映都很慢。谢谢了。

解决方案 »

  1.   

    为什么要用timer而不是循环呢?(循环里加上doevents)
      

  2.   

    刚才看到我以前写的程序,先是timer轮询,然后OnComm事件再do event...
      

  3.   

    串口数据分析2种方式,轮询(定时)或中断(OnComm事件)显然事件是时效性最好的。
      

  4.   

    gettickcount
    while(1)
    doevents
    sleep()
      

  5.   

    更大的问题是当窗体拖动等操作时Timer是不工作的,串口的数据也得不到及时处理,用 ActiveX EXE 方案好点。
      

  6.   

    俺一般用vc做,开线程,vb线程不怎么样。
      

  7.   


    如果仪表的数据是自动发送的话,用 OnComm 事件就可以了。如果需要命令触发,还没有想到有什么更好的办法。
      

  8.   

    5个程序各管一个com数据, 一个画曲线的程序, 前5个受到数据通讯给后一个程序.
      

  9.   

    个人认为VB不适合做这方面的程序处理,选择 C 语言或其他类似的开发工具可能效果会好一点。
    虽然咋一看用 VB 开发是可以实现这个需求,很多人可能认为要出问题多半也是出在开发人员的
    技术水平身上,但是看看我下面的分析可能就不是这么认为的了。
    通常一个这样的程序多多少少要涉及到一些图形、时间、硬件、数据库、网络等操作。而且需要
    长期运行程序来采集或控制硬件的过程。单独看好像都没什么大问题,问题就在于他们整合起来
    就会占用很多的CPU。而且微软的串口控件在CPU占用率方面也并不是控制得很好,更加容易导致
    在平凡的通讯过程中占用很大的CPU比例。在现在的双核PC跑起来有时候都有点吃力,特别是当你
    的计算机不只是运行一个任务的时候,通讯速度还会根据你的计算机速度而受影响。
    在高点配置的 PC 估计CPU在 50% 以上,在低一点配置的 PC 估计长时间都是 100% 的情况,只
    要真正开始工作就可能会有假死的现象。即使没开始网络和串口通讯,运行别的程序(比如我的电脑)
    都有可能很慢(这是说在配置教低一点的 PC 的运行情况)。
    作为工控用的设备来说,控制成本是很重要的,不可能每个设备都用市场上主流的设备来跑程序。
    量少没关系,但量大了这一块就是很大的一个成本开销。
    在换个角度看,即使是在主流的 PC 上跑这些东西,用VB做出来的同样也会有少许的假死现象,只是
    时间没那么长,感觉基本能接受而已。但是如果下位机对通讯速度有所要求,那么用VB就很难很好的
    胜任这类工作。
    在上面我提到过的东西我在VC下也重现过整个过程,在我说的配置高的 PC 上 CPU 占用率可以控制
    得很低,我用的是类似2D游戏的开发程序的 UI,用多线程的方式实现串口和网络部分,同样也用多
    线程的方式实现任务管理即委派操作。在AI程序的运算上当然要比VB快很多,即使这样,我整体调试
    从图形的流畅度到网络的通讯及任务处理到串口通讯的信息采集和任务下达,都做到让我满意的条件后,
    CPU占用率也在 5%-8% 左右,运行别的程序根本就不受影响,在我说的配置比较低的机器上 CPU 占用
    率也就是在 8%-15% 之间,而且不会有那种假死现象,更不会影响到其他程序的运行。而且这种 CPU
    的占用率是在 1024*768 的屏幕上做每秒15针的图形运算上得出的结果,而且这些图形运算还包括很多
    透明、半透明、平铺、旋转、阴影(真正的阴影效果)、动画、文字、文字阴影(真正的阴影效果)的操作,
    而且动画效果看起来很流畅,包括鼠标(带动画和阴影的)的快速移动效果都很流畅。
    如果不是这个图形的操作,单纯监视串口通讯和网络通讯部分,CPU占用率通常就看不见,最多是 1%的
    起伏。
    当然,VB的我也实现过相同的功能,很多还是直接条用VC些的API函数来处理图形,但是跑起来还是有
    假死和卡的现象,CPU就不用说了,卡的时候肯定是 100%,不卡的时候也是 50% 以上,而且增幅很大。对于VB不好控制CPU占用资源这一块很难有好的解决方法,特别是这类程序的开发,如果不注意,估计写
    出来的程序也不能很好的用到市场(起码产品化比较难)。所以建议弄这类开发还是看看别的工具好一点。
    如果碰到需求比较多,工程越来越大的时候才去考虑解决CPU占用问题,那时候项目估计就黄了。
      

  10.   


    如执行MsgBox,鼠标点击最小化、最大化窗口按钮时,消息队列是被阻断的。
      

  11.   

    1、设置Timer控件的时间间隔,把它缩小,让前后两次Timer事件间隔更小。
    2、设置一个选择条件,使用多分支选择语句(Select case)来选择执行要进行通信仪表,一次只执行一个,这样Timer执行5次就能把所有通信都进行一次了。
    3、根据实际情况分析,紧要的通信时间间隔短些通信,不那么紧要的等待长些通信。类似于多线程的优先级分配。
    4、可以在通信函数的等待过程中加入DoEvents语句,这样可以在串口通信等待下位机返回数据时释放CPU资源给其它操作,比如你点击按钮式触发的Click事件,这样就可以避免界面操作响应缓慢了。
      

  12.   

    问题的关键在于你把你的通信需求梳理清楚,什么紧要,你可以通信频繁些,什么不那么紧要,你就通信间隔长些。如果通信量比较大,建议你不要使用OnComm,毕竟他要中断你的Timer去执行,你就在Timer中等待片刻(在这个片刻中加入DoEvents,可以释放CPU资源,不会让你的程序卡死)后再去读取串口的数据就是了。这样会让你的程序执行起来显得流畅些。