各位大虾好。
最近做一个程序,基本都是采用串口采集仪表的程序,一共用了5个COM口,我使用了Timer控件来采集,感觉采集的速度比较慢,请问有什么好方法吗?而且在数据采集的时候如果操作画面,比如按按钮的话反映都很慢。谢谢了。
最近做一个程序,基本都是采用串口采集仪表的程序,一共用了5个COM口,我使用了Timer控件来采集,感觉采集的速度比较慢,请问有什么好方法吗?而且在数据采集的时候如果操作画面,比如按按钮的话反映都很慢。谢谢了。
while(1)
doevents
sleep()
如果仪表的数据是自动发送的话,用 OnComm 事件就可以了。如果需要命令触发,还没有想到有什么更好的办法。
虽然咋一看用 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占用问题,那时候项目估计就黄了。
如执行MsgBox,鼠标点击最小化、最大化窗口按钮时,消息队列是被阻断的。
2、设置一个选择条件,使用多分支选择语句(Select case)来选择执行要进行通信仪表,一次只执行一个,这样Timer执行5次就能把所有通信都进行一次了。
3、根据实际情况分析,紧要的通信时间间隔短些通信,不那么紧要的等待长些通信。类似于多线程的优先级分配。
4、可以在通信函数的等待过程中加入DoEvents语句,这样可以在串口通信等待下位机返回数据时释放CPU资源给其它操作,比如你点击按钮式触发的Click事件,这样就可以避免界面操作响应缓慢了。