我用软件版本是LabWindows CVI 8.5版本,我也是去年才开始摸索,因为有点 C语言的底子(我是学电子的,可大学除了数字电路和C语言课程每次都是高分外,其他几门课程完全靠老师的心情),学起来觉得不是很难,毕竟我不是编程科班出生,所以后的代码可能不是很规范,希望各位专业人士教教我,有什么错的或者不好的习惯跟我说说,小弟先在这多谢了,不说废话正题来了!
LabWindows CVI控件添加里面有个Timer如下图,是一个同步定时器,可是要当你用到多个定时器同事工作,这个定时中断就很让人蛋疼,特别是通讯过程中,会让主界面功能反应无法满意,所以就需要建立异步定时器来处理一些东西。下面是建立的步骤:
首先向主程序的源文件添加必要的头文件,以及向工程里添加异步定时器的.C文件,它的原始文件放在CVI安装目录里面,地址一般是C:\Program Files\National Instruments\CVI85\toolslib\toolbox,里面有三种文件,扩展名分别是.h / .c /.fp,其中.fp是控件的资源文件,异步定时器的名字是asynctmr,把这三个文件分别加入工程相应的目录中,然后再在工程文件中载入头文件,入下图
导入头文件:#include “asynctmr.h”
接下来就要开始建立异步定时器了,现在main()前面申请回调函数名,就是当中断发生时运行的函数。这个一定要按照以下格式命名,int CVICALLBACK NAV_Timer (int reserved, int timerId, int event, void *callbackData, int eventData1, int eventData2);//定义处理CNI上传数据异步定时器回调函数。
其中CNI_Timer是回调函数名字,其他不能变动,
接着就是建立一个异步定时器
有三个语句
plNAV_TEMER = NewAsyncTimer (1.0, -1, 0, NAV_Timer,""); //建立一个异步定时器
SetAsyncTimerAttribute (plNAV_TEMER, ASYNC_ATTR_ENABLED, 0);
SetAsyncTimerAttribute (plNAV_TEMER, ASYNC_ATTR_INTERVAL, 0.05);
plNAV_TEMER是一个static int类型的参数,用于保存以不定时器的句柄,设置属性或者要释放资源的时候会用到它。
SetAsyncTimerAttribute (plNAV_TEMER, ASYNC_ATTR_ENABLED, 0);这调语句是给异步定时器使能用的,最后个参数为0的时候不运行中断程序,当为1的时候运行中断程序,我们可以通过这条语句控制定时器的工作状态。参数plNAV_TEMER就是说我要调用哪一个控件,或者界面。
SetAsyncTimerAttribute (plNAV_TEMER, ASYNC_ATTR_INTERVAL, 0.05);这条语句定义的是定时器中断时间,0.05表示50ms中断一次。
最后释放异步定时器资源,语句是
DiscardAsyncTimer(plNAV_TEMER); //释放异步定时器
这个最好是程序结束时在释放,中间如果需要的话可以通过SetAsyncTimerAttribute (plNAV_TEMER, ASYNC_ATTR_ENABLED, 0);这条语句来暂停定时器。
最后还有就是编写中断回调程序,编写的格式是
int CVICALLBACK NAV_Timer (int reserved, int timerId, int event,
void *callbackData, int eventData1, int eventData2)//定义处理CNI上传数据
{
switch (event)
{
case EVENT_COMMIT:
在这里面写你的处理程序
break;
}
return 0;
}
小弟我第一次写个专业的学习文档,希望各位能多给出指点。
用户1825844 2015-1-30 13:41