羅霞 沈德容 貴州航天電子科技有限公司
RS-422通信技術廣泛應用于工程中,設計一個符合通信協(xié)議的計算機應用程序,是測試RS-422接口最簡便快捷的方法。
通常RS-422接口設備之間通信的周期一般為幾毫秒到幾十毫秒,對VC++程序而言,接收數據設計一個工作線程即可,發(fā)送數據則需要定時,而且定時精度決定了實時性。
本文通過設計發(fā)送數據的功能程序,研究各種定時方法的精度與性能,從而對定時方法進行評價,供編寫RS-422接口VC++程序的工程技術人員參考。
功能程序基于對話框,在主程序中打開串口,設置波特率為921600;編寫功能函數SendData( ),實現(xiàn)向RS-422接口發(fā)送一幀數據;設計定時方法,定時調用SendData( )函數。
映射WM_TIMER消息,在OnTimer函數中調用SendData( ),使用 SetTimer定時。
GetTickCount( )函數返回從操作系統(tǒng)啟動到當前所經過的毫秒數,常常用于測試一段代碼的執(zhí)行時間。定時需要創(chuàng)建線程,線程發(fā)送消息通知主程序時間,主程序掛起線程,在自定義消息函數中調用SendData( )按周期發(fā)送數據。線程函數中定時的代碼如下:
timeGetTime( )函數與GetTickCount( )函數使用方法相同。
使 用QueryPerformanceFrequency和QueryPerformanceCounter定時,CPU頻率越高,定時精度越高。定時需要創(chuàng)建線程,線程函數中定時的代碼如下:
多媒體計時器即windows提供的內置定時器timeSetEvent,其函數原型如下:
程序首先通過timeBeginPeriod( )函數和timeEndPeriod()函數設置定時器的最小解析精度,然后調用timeSetEvent( )函數,周期性執(zhí)行l(wèi)pTimeProc回調函數完成SendData( )任務。在定時器使用完畢后,及時調用timeKillEvent( )將之釋放。
運行程序使用不同定時器的發(fā)送數據,用示波器測試數據幀的周期。測試用電腦配置Intel(R) Pentium(R) D CPU 2.80GHz 2.79GHz,內存2.00GB,操作系統(tǒng)Microsoft Windows XP,示波器是安捷倫DS06052A(500MHz,4GSa/s),測試結果見表1。
表1 計時器測試結果
根據表1的測試結果,本文推薦在定時精度要求不高(通信的周期大于100ms)時,使用WM_TIMER定時;精度要求較高(通信的周期小于10ms)時,使用多媒體計時器。CPU時鐘頻率定時可以用來作延時,不影響其他任務。