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