1、打開串口
win32系統把文件的概念進行了擴展。無論是文件、通信設備、命名管道、郵件槽、磁盤、還是控制臺,都是用api函數createfile來打開或創建的。該函數的原型為:
handlecreatefile(lpctstrlpfilename,
dworddwsharemode,
lpsecurity_attributeslpsecurityattributes,
dworddwcreationdistribution,
dworddwflagsandattributes,
handlehtemplatefile);
各個參數說明如下:
lpfilename:將要打開的串口邏輯名,如“com1”;
dwdesiredaccess:指定串口訪問的類型,可以是讀取、寫入或二者并列;
dwsharemode:指定共享屬性,由于串口不能共享,該參數必須置為0;
lpsecurityattributes:引用安全性屬性結構,缺省值為null;
dwcreationdistribution:創建標志,對串口操作該參數必須置為open_existing;
dwflagsandattributes:屬性描述,用于指定該串口是否進行異步操作,該值為file_flag_overlapped,表示使用異步的i/o;該值為0,表示同步i/o操作;
htemplatefile:對串口而言該參數必須置為null;
2、配置串口
在打開通訊設備句柄后,常常需要對串口進行一些初始化配置工作。這需要通過一個dcb結構來進行。dcb結構包含了諸如波特率、數據位數、奇偶校驗和停止位數等信息。在查詢或配置串口的屬性時,都要用dcb結構來作為緩沖區。在打開串口后,可以調用getcommstate函數來獲取串口的默認配置,該函數獲取一個dcb結構體,只要在該結構內對應該先修改dcb結構,然后再調用setcommstate函數以修改后的dcb結構設置串口。dcb主要有以下幾個重要的成員:bytebytesize;//通信字節位數byteparity;//指定奇偶校驗方法。此成員可以有下列值://evenparity偶校驗noparity無校驗//markparity標記校驗oddparity奇校驗bytestopbits;//指定停止位的位數。此成員可以有下列值://onestopbit1位停止位//twostopbits2位停止位//one5stopbits1.5位停止位
除了使用bcd設置串口的一些基本參數外,一般還需要設置串口收發數據緩沖區的大小和超時,超時的作用是在指定的時間內沒有讀入或發送指定數量的字符,讀寫操作仍然會結束。windows用i/o緩沖區來暫存串口輸入和輸出的數據,如果通信的速率較高,則應該設置較大的緩沖區。我們可以使用api函數setupcomm設置串口的輸入和輸出緩沖區的大小,其原型如下:boolsetupcomm(handlehfile,//串口句柄dworddwinqueue,//輸入緩沖區的大小(字節數)dworddwoutqueue);//輸出緩沖區的大小(字節數)
關于讀寫串口的超時設置,windows給我們提供一個專門的結構體commtimeouts,其定義如下:typedefstruct_commtimeouts{dwordreadintervaltimeout;//讀間隔超時dwordreadtotaltimeoutmultiplier;//讀時間系數dwordreadtotaltimeoutconstant;//讀時間常量dwordwritetotaltimeoutmultiplier;//寫時間系數dwordwritetotaltimeoutconstant;//寫時間常量}commtimeouts,*lpcommtimeouts;
commtimeouts結構的成員都以毫秒為單位。總超時的計算公式是:
總超時=時間系數×要求讀/寫的字符數+時間常量
例如,要讀入10個字符,那么讀操作的總超時的計算公式為:
讀總超時=readtotaltimeoutmultiplier×10+readtotaltimeoutconstant
通過該結構體windowsapi為我們提供兩個函數:getcommtimeouts和setcommtimeouts,前者獲取當前的超時設置,后者使用修改后的commtimeouts設置超時,與設置串口闡述類似。
在讀寫串口之前,還要用purgecomm(…)函數清空緩沖區,該函數原型:
boolpurgecomm(
handlehfile,//串口句柄
dworddwflags);//需要完成的操作
參數dwflags指定要完成的操作,可以是下列值的組合:
purge_txabort中斷所有寫操作并立即返回,即使寫操作還沒有完成。
purge_rxabort中斷所有讀操作并立即返回,即使讀操作還沒有完成。
purge_txclear清除輸出緩沖區
purge_rxclear清除輸入緩沖區
3、讀寫串口
讀寫串口使用readfile和writefile兩個函數,其原型如下:boolreadfile(handlehfile,//串口的句柄lpvoidlpbuffer,//保存讀入數據的指針,dwordnnumberofbytestoread,//要讀入的數據的字節數lpdwordlpnumberofbytesread,//實際讀入的字節數lpoverlappedlpoverlapped);//overlapped,同步為null
boolwritefile(
handlehfile,//串口的句柄
lpcvoidlpbuffer,//要寫入數據的地址
dwordnnumberofbytestowrite,//要寫入數據的字節數
lpdwordlpnumberofbyteswritten,//實際寫入的字節數
lpoverlappedlpoverlapped);//overlapped,同步為null在進行同步操作時,讀寫函數要等到執行完才返回,而在異步操作時函數立即返回,但不保證讀寫操作完成,這時候就需要使用overlapped結構進行異步控制,該結構體有一個重要的成員hevent,該成員是windows事件對象的句柄在控制線程同步及異步操作時常用到,如果是異步操作,我們可以使用createevent(…)創建事件對象并將返回值賦給hevent,然后使用waitforsingleobject或getoverlappedresult等待讀寫操作完成,進而達到控制異步操作的目的。3.4關閉串口在不使用串口的時候應該將其關閉,以釋放windows的資源供其他程序使用,關閉串口只需調用closehandle(hcomm/*串口句柄*/)即可。4串行通信在世紀星組態軟件中的應用作為通用的組態軟件,世紀星要與其他plc、智能儀表等設備進行通信,串行通信是主要的方式之一,基于前面所述使用api進行串行通信開發的優點,并考慮程序開發的便捷和可重用等,在世紀星中,我們將串行通信api進行封裝,以類的方式對串口進行操作,其中打開串口及配置串口參數的操作我們通過可視化窗口進行設定,然后在封裝類中實現,相關的操作處理讀寫數據外基本都已實現,因為不同的設備有不同的協議,因而讀寫串口的操作在驅動程序中完成,這樣我們的開發人員就不必關注太多其他的相關操作,只需根據實際設備重寫讀寫串口的成員函數即可。5結論windows是當前應用程序開發的主流平臺,vc++6.0是該平臺強大的開發工具,使用windowsapi開發串口通信的程序可是使我們更加清晰的了解串口通信的機制,并且開發人員可以根據需要使用api進行靈活的程序設計,在scada中串行通信是必不可少的技術,所以掌握串行通信的開發方法具有現實意義。
評論
查看更多