二 串列埠通訊的一般步驟

2021-08-30 23:06:29 字數 3225 閱讀 8169

2.1開啟串列埠

在32位windows中,串列埠和其他通訊裝置(如磁碟等)都被作為檔案進行處理,在使用前必須先將其開啟,為保證串列埠通訊資料傳輸的可靠性,串列埠一般以非共享模式開啟,也就是在被串列埠開啟後,其他程式不能在去開啟此裝置。

2.2配置串列埠

在使用串列埠進行資料通訊前必須對其進行正確的配置,串列埠需要配置的主要引數有波特率、資料位、停止位、奇偶校驗、收發資料緩衝區大小。除此之外還要對串列埠進行超時設定,以防止在串列埠通訊時資料傳輸突然中斷而導致讀寫操作進入無限期等待的狀態,設定了超時,如果在指定時間內沒有完成所進行的操作,則此操作被自動放棄。

2.3讀寫串列埠

在串列埠被開啟並設定好後,就可以使用串列埠進行讀寫資料了,讀寫資料可以採用同步、非同步及事件驅動等多種方式。

2.4關閉串列埠

在使用完串列埠後應該將其關閉,如果沒有關閉,該串列埠會處於開啟狀態,其他的應用程式便無法開啟使用該串列埠。

3利用api函式實現串列埠通訊

3.1開啟串列埠

win32系統把檔案的概念進行了擴充套件。無論是檔案、通訊裝置、命名管道、郵件槽、磁碟、還是控制台,都是用api函式createfile來開啟或建立的。該函式的原型為:

handlecreatefile(lpctstrlpfilename,

dworddwdesiredaccess,

dworddwsharemode,

lpsecurity_attributeslpsecurityattributes,

dworddwcreationdistribution,

dworddwflagsandattributes,

handlehtemplatefile);

各個引數說明如下:

lpfilename:將要開啟的串列埠邏輯名,如「com1」;

dwdesiredaccess:指定串列埠訪問的型別,可以是讀取、寫入或二者並列;

dwsharemode:指定共享屬性,由於串列埠不能共享,該引數必須置為0;

lpsecurityattributes:引用安全性屬性結構,預設值為null;

dwcreationdistribution:建立標誌,對串列埠操作該引數必須置為open_existing;

htemplatefile:對串列埠而言該引數必須置為null;

3.2配置串列埠

在開啟通訊裝置控制代碼後,常常需要對串列埠進行一些初始化配置工作。這需要通過乙個dcb結構來進行。dcb結構包含了諸如波特率、資料位數、奇偶校驗和停止位數等資訊。在查詢或配置串列埠的屬性時,都要用dcb結構來作為緩衝區。在開啟串列埠後,可以呼叫getcommstate函式來獲取串列埠的預設配置,該函式獲取乙個dcb結構體,只要在該結構內對應該先修改dcb結構,然後再呼叫setcommstate函式以修改後的dcb結構設定串列埠。dcb主要有以下幾個重要的成員:

bytebytesize;//通訊位元組位數

byteparity;//指定奇偶校驗方法。此成員可以有下列值:

//evenparity偶校驗noparity無校驗

//markparity標記校驗oddparity奇校驗

bytestopbits;//指定停止位的位數。此成員可以有下列值:

//onestopbit1位停止位

//twostopbits2位停止位

位停止位

除了使用bcd設定串列埠的一些基本引數外,一般還需要設定串列埠收發資料緩衝區的大小和超時,超時的作用是在指定的時間內沒有讀入或傳送指定數量的字元,讀寫操作仍然會結束。windows用i/o緩衝區來暫存串列埠輸入和輸出的資料,如果通訊的速率較高,則應該設定較大的緩衝區。我們可以使用api函式setupcomm設定串列埠的輸入和輸出緩衝區的大小,其原型如下:

boolsetupcomm(

handlehfile,//串列埠控制代碼

dworddwinqueue,//輸入緩衝區的大小(位元組數)

dworddwoutqueue);//輸出緩衝區的大小(位元組數)

關於讀寫串列埠的超時設定,windows給我們提供乙個專門的結構體commtimeouts,其定義如下:

typedefstruct_commtimeoutscommtimeouts,*lpcommtimeouts;

commtimeouts結構的成員都以毫秒為單位。總超時的計算公式是:

總超時=時間係數×要求讀/寫的字元數+時間常量

例如,要讀入10個字元,那麼讀操作的總超時的計算公式為:

讀總超時=readtotaltimeoutmultiplier×10+readtotaltimeoutconstant

通過該結構體windowsapi為我們提供兩個函式:getcommtimeouts和setcommtimeouts,前者獲取當前的超時設定,後者使用修改後的commtimeouts設定超時,與設定串列埠闡述類似。

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

boolpurgecomm(

handlehfile,//串列埠控制代碼

dworddwflags);//需要完成的操作

引數dwflags指定要完成的操作,可以是下列值的組合:

purge_txabort中斷所有寫操作並立即返回,即使寫操作還沒有完成。

purge_rxabort中斷所有讀操作並立即返回,即使讀操作還沒有完成。

purge_txclear清除輸出緩衝區

purge_rxclear清除輸入緩衝區

3.3讀寫串列埠

讀寫串列埠使用readfile和writefile兩個函式,其原型如下:

boolreadfile(

handlehfile,//串列埠的控制代碼

lpvoidlpbuffer,//儲存讀入資料的指標,

dwordnnumberofbytestoread,//要讀入的資料的位元組數 內容來自plcclub.com

lpdwordlpnumberofbytesread,//實際讀入的位元組數

boolwritefile(

handlehfile,//串列埠的控制代碼

lpcvoidlpbuffer,//要寫入資料的位址

dwordnnumberofbytestowrite,//要寫入資料的位元組數

lpdwordlpnumberofbyteswritten,//實際寫入的位元組數

3.4關閉串列埠

在不使用串列埠的時候應該將其關閉,以釋放windows的資源供其他程式使用,關閉串列埠只需呼叫closehandle(hcomm/*串列埠控制代碼*/)即可。

stm32 串列埠配置一般步驟

1 串列埠時鐘使能,gpio時鐘使能 rcc apb2periphclockcmd 2 串列埠復位 usart deinit 非必需 3 gpio埠模式設定 gpio init 模式設定為 gpio mode af pp 4 串列埠引數初始化 usart init 5 開啟中斷並初始化nvic 當開...

串列埠配置的一般步驟

串列埠配置的一般步驟 串列埠時鐘使能,gpio時鐘使能 rcc apb2periphclockcmd 串列埠復位 usart deinit 這一步不是必須的 gpio埠模式設定 gpio init 模式設定為gpio mode af pp 串列埠引數初始化 usart init 開啟中斷並且初始化n...

jdbc的一般步驟

1.匯入jdbc驅動jar 2.註冊jdbc驅動 引數 驅動程式類名 class.forname 驅動程式類名 3.獲得connection物件 conn.getstatement 方法建立物件 用於執行sql語句 execute sql 執行任何sql,常用執行ddl executeupdate ...