有兩種方式可以操作串列埠:同步操作方式和非同步操作方式(即重疊操作方式)。同步操作時,api函式會阻塞直到操作完成以後才能返回(在多執行緒方式中,雖然不會阻塞主線程,但是仍然會阻塞監聽執行緒);而非同步操作方式,api函式會立即返回,操作在後台進行,避免程序阻塞。非同步操作方式還允許讀、寫操作能同時進行(即重疊操作),在實際科研專案中非常有用。但是無論哪種操作方式,一般都通過下面的四個步驟來完成:1.開啟串列埠;
2.配置串列埠
3.讀寫串列埠
4.關閉串列埠
在很多系統中(包括windows系統)把檔案的概念進行了拓展。無論是檔案、通訊裝置、命名管道、郵件槽、磁碟、還是控制台,都是用api函式createfile()來開啟或建立的。該函式的原型是:同步i/o方式開啟串列埠的示例**如下:handle createfile(
lpctstr lpfilename, //將要開啟的串列埠邏輯名
dword dwdesiredaccess, //指定串列埠訪問的型別
dword dwsharemode, //指定共享屬性
lpsecurity_attributes lpsecurityattributes, //引用安全型屬性結構
dword dwcreationdistribution, //建立標誌
dword dwflagsandattributes, //屬性描述
handle htemplatefile //對串列埠而言該引數必須置為null
);
與同步i/o方式開啟的過程與步驟相同,只是引數有點變化,非同步i/o開啟串列埠的**示例如下:handle opencom()
return hcom;
}
handle opencom()
return hcom;
}
再開啟通訊裝置控制代碼後,常常需要對串列埠進行一些初始化配置工作。配置串列埠的一些屬性,如串列埠通訊引數、通訊超時設定、緩衝區申請及緩衝區清空操作等。2.1 設定串列埠引數:
設定串列埠引數需要通過乙個dcb結構來進行。dcb結構包含了諸如波特率、資料位數、奇偶校驗和停止位數等資訊。在查詢或配置串列埠的屬性時,都要通過乙個dcb結構的緩衝區。
一般情況下,我們在採用createfile開啟串列埠後,可以呼叫getcommonstate()函式來獲取串列埠的初始配置。要修改串列埠的配置,應該先修改dcb結構,然後呼叫setcommonstate()函式設定串列埠。dcb結構包含了串列埠的各項引數設定,下面給出了dcb結構中常用的5個成員變數:
baudrate:波特率,dword型變數,指定通訊裝置的傳輸速率。這個成員可以是實際波特率值或者是下表的常量值之一。
fparity:指定奇偶校驗使能,dword型變數,若此成員為1,則允許奇偶校驗檢查。
bytesize:通訊位元組位數,4-8,byte型變數。
parity:指定奇偶校驗方法,byte型變數。此成員的取值如下表所示。
奇偶校驗常見常量值
winbase.h中的定義
說明noparity
#define noparity 0
採用無校驗方式
oddparity
#define oddparity 1
採用奇校驗方式
evenparity
#define evenparity 2
採用偶校驗方式
markparity
#define markparity 3
採用標記校驗方式
stopbits:指定停止位的位數,byte型變數。此成員取值如下表所示。
停止位常見變數值
winbase.h中的定義
說明onestopbit
#define onestopbit 0
1位停止位
one5stopbits
#define one5stopbits 1
1.5位停止位
twostopbits
#define twostopbits 2
2位停止位
而通過setcommstate()函式則可以設定com口的裝置控制塊,函式原型如下:bool getcommstate(
handle hfile, //標識通訊埠的控制代碼
lpdcb lpdcb //指向乙個裝置控制塊(dcb結構)的指標
);
2.2 串列埠通訊超時設定bool setcommstate(
handle hfile, //標識通訊埠的控制代碼
lpdcb lpdcb //指向乙個裝置控制塊(dcb結構)的指標
);
:再用readfile和writefile讀寫序列口時,必須要考慮超時問題。超時的作用是在指定的時間內沒有讀入或傳送指定數量的字元,readfile或writefile的操作仍然會結束。
要查詢當前的超時設定,用呼叫getcommtimeouts()函式,該函式會填充乙個commtimeouts結構。呼叫setcommtimeouts()函式可以用某乙個commtimeouts結構的內容來設定超時。
讀寫串列埠的超時有兩種:間隔超時和總超時。間隔超時是指在接收時兩個字元之間的最大延時。總超時是指讀寫操作總共花費的最大時間。寫操作只支援總延時,而讀操作都支援。用
commtimeouts結構可以規定讀寫操作的延時。commtimeouts結構的定義如下:
typedef struct_commtimeouts
commtimeouts,*plcommtimeouts;
commtimeouts結構的成員都是以毫秒為單位,總超時的計算公式:
總超時=時間係數*要求讀/寫的字元數+時間常量
例如,要讀入50個字元,那麼讀操作的總超時的時間計算公式:
readtotaltimeout = readtotaltimeoutmultiplier*50+readtotaltimeoutconstant
可以看出,間隔超時與總超時的設定是不相關的,這可以方便通訊程式靈活地設定各種超時。
2.3 申請串列埠通訊緩衝區:
除了在dcb中的設定外,程式一般還需要設定i/o緩衝區的大小和超時。windows用i/o緩衝區來暫存串列埠的輸入和輸出資料。如果通訊的速率較高,則應該設定較大的緩衝區。呼叫setcommon()函式可以設定序列口的輸入和輸出緩衝區大小,函式原型如下:
2.4 清空串列埠通訊緩衝區:bool setupcommon(
handle hfile; //通訊裝置的控制代碼
dword dwinqueue; //輸入緩衝區的大小(位元組數)
dword dwoutqueue;//輸出緩衝區的大小
);
在讀寫串列埠之前,還要用purgecommon()函式清空緩衝區,該函式的原型如下:
引數dwflags指定要完成的操作,應該選擇下面表中質的組合:bool purgecommon(
handle hfile; //串列埠控制代碼
dword dwflags
);
值說明purge_rxabord
中斷所有讀操作並立即返回,即使讀操作還沒有完成
purge_txabort
中斷所有寫操作並立即返回,即使寫操作還沒有完成
purge_txclear
清除輸出緩衝區
purge_rxclear
清除輸入緩衝區
最後,進行乙個小結,給出了串列埠屬性的示例**,如下所示:
setcomm(handle hcom)
RS232串列埠通訊模組
應為工作需要自己編寫的rs232通訊模組,該模組已經編寫了蠻久,在實際使用中可能有沒有考慮和不完善的地方。如果使用該模組請保留該注釋,如果被修改或編輯請將修改後的 傳送乙份給我 編寫 戴琪英 e mail qiyingdai 163.com 2000 09 01 unit r232comm inte...
串列埠通訊模組5 串列埠操作自定義類 2
processerrormessage 函式負責處理並提示錯誤資訊,其實現過程如下 void cmyserial processerrormessage char errortext 設計思想 首先,呼叫formatmessage 函式,將getlasterror 函式返回的錯誤號轉化成字串資訊。然...
串列埠通訊 2
串列埠通訊 非同步通訊方式 序列通訊可以分為兩種型別 同步通訊 非同步通訊。1.非同步通訊的特點及資訊幀格式 以起止式非同步協議為例,下圖顯示的是起止式一幀資料的格式 圖1起止式非同步通訊的特點是 乙個字元乙個字元地傳輸,每個字元一位一位地傳輸,並且傳輸乙個字元時,總是以 起始位 開始,以 停止位 ...