VC++应用软件程序实现RS-422实时通信的方法研究
2018-07-12罗霞沈德容贵州航天电子科技有限公司
罗霞 沈德容 贵州航天电子科技有限公司
1 引言
RS-422通信技术广泛应用于工程中,设计一个符合通信协议的计算机应用程序,是测试RS-422接口最简便快捷的方法。
通常RS-422接口设备之间通信的周期一般为几毫秒到几十毫秒,对VC++程序而言,接收数据设计一个工作线程即可,发送数据则需要定时,而且定时精度决定了实时性。
本文通过设计发送数据的功能程序,研究各种定时方法的精度与性能,从而对定时方法进行评价,供编写RS-422接口VC++程序的工程技术人员参考。
2 定时方法
功能程序基于对话框,在主程序中打开串口,设置波特率为921600;编写功能函数SendData( ),实现向RS-422接口发送一帧数据;设计定时方法,定时调用SendData( )函数。
2.1 使用WM_TIMER定时
映射WM_TIMER消息,在OnTimer函数中调用SendData( ),使用 SetTimer定时。
2.2 使用GetTickCount( )函数定时
GetTickCount( )函数返回从操作系统启动到当前所经过的毫秒数,常常用于测试一段代码的执行时间。定时需要创建线程,线程发送消息通知主程序时间,主程序挂起线程,在自定义消息函数中调用SendData( )按周期发送数据。线程函数中定时的代码如下:
2.3 使用timeGetTime( )函数定时
timeGetTime( )函数与GetTickCount( )函数使用方法相同。
2.4 使用CPU时钟频率定时
使 用QueryPerformanceFrequency和QueryPerformanceCounter定时,CPU频率越高,定时精度越高。定时需要创建线程,线程函数中定时的代码如下:
2.5 使用多媒体计时器
多媒体计时器即windows提供的内置定时器timeSetEvent,其函数原型如下:
程序首先通过timeBeginPeriod( )函数和timeEndPeriod()函数设置定时器的最小解析精度,然后调用timeSetEvent( )函数,周期性执行lpTimeProc回调函数完成SendData( )任务。在定时器使用完毕后,及时调用timeKillEvent( )将之释放。
3 测试结果
运行程序使用不同定时器的发送数据,用示波器测试数据帧的周期。测试用电脑配置Intel(R) Pentium(R) D CPU 2.80GHz 2.79GHz,内存2.00GB,操作系统Microsoft Windows XP,示波器是安捷伦DS06052A(500MHz,4GSa/s),测试结果见表1。
表1 计时器测试结果
4 结论
根据表1的测试结果,本文推荐在定时精度要求不高(通信的周期大于100ms)时,使用WM_TIMER定时;精度要求较高(通信的周期小于10ms)时,使用多媒体计时器。CPU时钟频率定时可以用来作延时,不影响其他任务。