串列埠通訊模組2 串列埠通訊程式設計基礎 開啟 配置

2021-07-23 05:37:10 字數 4287 閱讀 8357

有兩種方式可以操作串列埠:同步操作方式和非同步操作方式(即重疊操作方式)。同步操作時,api函式會阻塞直到操作完成以後才能返回(在多執行緒方式中,雖然不會阻塞主線程,但是仍然會阻塞監聽執行緒);而非同步操作方式,api函式會立即返回,操作在後台進行,避免程序阻塞。非同步操作方式還允許讀、寫操作能同時進行(即重疊操作),在實際科研專案中非常有用。但是無論哪種操作方式,一般都通過下面的四個步驟來完成:

1.開啟串列埠;

2.配置串列埠

3.讀寫串列埠

4.關閉串列埠

在很多系統中(包括windows系統)把檔案的概念進行了拓展。無論是檔案、通訊裝置、命名管道、郵件槽、磁碟、還是控制台,都是用api函式createfile()來開啟或建立的。該函式的原型是:

handle createfile(

lpctstr lpfilename, //將要開啟的串列埠邏輯名

dword dwdesiredaccess, //指定串列埠訪問的型別

dword dwsharemode, //指定共享屬性

lpsecurity_attributes lpsecurityattributes, //引用安全型屬性結構

dword dwcreationdistribution, //建立標誌

dword dwflagsandattributes, //屬性描述

handle htemplatefile //對串列埠而言該引數必須置為null

);

同步i/o方式開啟串列埠的示例**如下:

handle opencom()

return hcom;

}

與同步i/o方式開啟的過程與步驟相同,只是引數有點變化,非同步i/o開啟串列埠的**示例如下:

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位停止位

bool getcommstate(

handle hfile, //標識通訊埠的控制代碼

lpdcb lpdcb //指向乙個裝置控制塊(dcb結構)的指標

);

而通過setcommstate()函式則可以設定com口的裝置控制塊,函式原型如下:

bool setcommstate(

handle hfile, //標識通訊埠的控制代碼

lpdcb lpdcb //指向乙個裝置控制塊(dcb結構)的指標

);

2.2 串列埠通訊超時設定

:再用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()函式可以設定序列口的輸入和輸出緩衝區大小,函式原型如下:

bool setupcommon(

handle hfile; //通訊裝置的控制代碼

dword dwinqueue; //輸入緩衝區的大小(位元組數)

dword dwoutqueue;//輸出緩衝區的大小

);

2.4 清空串列埠通訊緩衝區

在讀寫串列埠之前,還要用purgecommon()函式清空緩衝區,該函式的原型如下:

bool purgecommon(

handle hfile; //串列埠控制代碼

dword dwflags

);

引數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起止式非同步通訊的特點是 乙個字元乙個字元地傳輸,每個字元一位一位地傳輸,並且傳輸乙個字元時,總是以 起始位 開始,以 停止位 ...