VC串列埠程式設計

2021-06-15 09:45:15 字數 4512 閱讀 7383

本文**:

1、api描述

在win32 api

中,串列埠使用檔案方式進行訪問,其操作的

api基本上與檔案操作的

api一致。

一、開啟串列埠

win32 中用於開啟串列埠的api 函式為createfile,其原型為:

例如,以下程式用於以同步讀寫方式開啟串列埠com1:

handle hcom;

dword dwerror;

hcon = createfile("com1", generic_read | generic_write, 0, null, open_existing, 0, null);

if (hcom == (handle)0xffffffff)

配置串列埠是通過改變裝置控制塊

dcb(device control block)

的成員變數值來實現的,接收緩衝區和傳送緩衝區的大小可通過setupcomm函式來設定。

資料控制塊

(dcb)

結構定義了序列通訊裝置的控制項設定。

opencomm()

和buildcommdcb()

初始化dcb

結構。但是,不能更改使用這些過程的

dcb

中有多個字段。可以直接,更新這些域,可以將這些更改應用於使用

setcommstate()

通訊埠。

dcb結構體定義為:

typedef struct _dcb dcb;

除了使用

bcd設定串列埠的一些基本引數外,一般還需要設定串列埠收發資料緩衝區的大小和超時,超時的作用是在指定的時間內沒有讀入或傳送指定數量的字元,讀寫操作仍然會結束。

windows

用i/o

緩衝區來暫存串列埠輸入和輸出的資料,如果通訊的速率較高,則應該設定較大的緩衝區。

(1)緩衝區大小設定

我們可以使用

api函式

setupcomm

設定串列埠的輸入和輸出緩衝區的大小,其原型如下:

而setupcomm函式的原型則為:

bool setupcomm(

handle hfile, // handle to communications device

dword dwinqueue, // size of input buffer

dword dwoutqueue // size of output buffer);

以下程式將串列埠設定為:波特率為9600,資料位數為7位,停止位為2 位,偶校驗,接收緩衝區和傳送緩衝區大小均為1024個位元組,最後用purgecomm函式終止所有的後台讀寫操作並清空接收緩衝區和傳送緩衝區:

dcb dcb;

dcb.baudrate = 9600; //波特率為9600

dcb.bytesize = 7; //資料位數為7位

dcb.parity = evenparity; //偶校驗

dcb.stopbits = 2; //兩個停止位

dcb.fbinary = true;

dcb.fparity = true;

if (!setcommstate(hcom, &dcb))

setupcomm(hcom, 1024, 1024);

purgecomm(hcom, purce_txabort | purge_rxabort | purge_txclear | purge_rxclear);

(2)超時設定

超時設定是通過改變commtimeouts結構體的成員變數值來實現的,commtimeouts

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

總超時=時間係數×要求讀

/寫的字元數+時間常量

例如,要讀入

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

讀總超時=

readtotaltimeoutmultiplier×10

+readtotaltimeoutconstant

通過該結構體

windowsapi

為我們提供兩個函式:

getcommtimeouts

和setcommtimeouts

,前者獲取當前的超時設定,後者使用修改後的

commtimeouts

設定超時,與設定串列埠闡述類似。

commtimeouts的原型為:

typedef struct _commtimeouts

commtimeouts, *lpcommtimeouts;

設定超時的函式為setcommtimeouts,其原型中接收commtimeouts的指標為引數:

bool setcommtimeouts(

handle hfile, // handle to communications device

lpcommtimeouts lpcommtimeouts // pointer to comm time-out structure);

以下程式將串列埠讀操作的超時設定為10 毫秒:

commtimeouts to;

memset(&to, 0, sizeof(to));

to.readintervaltimeout = 10;

setcommtimeouts(hcom, &to);

與setcommtimeouts對應的getcommtimeouts()函式的原型為:

bool getcommtimeouts(

handle hfile, // handle of communications device

lpcommtimeouts lpcommtimeouts // pointer to comm time-out structure);

(3)事件設定

在讀寫串列埠之前,需要用setcommmask ()函式設定事件掩模來監視指定通訊埠上的事件,其原型為:

bool setcommmask(

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

dword dwevtmask //能夠使能的通訊事件);

有了set當然還會有get,與setcommmask對應的getcommmask()函式的原型為:

bool getcommmask(

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

lpdword lpevtmask // address of variable to get event mask);

串列埠上可以發生的事件可以是如下事件列表中的乙個或任意組合:ev_break、ev_cts、ev_dsr、ev_err、ev_ring、ev_rlsd、ev_rxchar、ev_rxflag、ev_txempty。

我們可以用waitcommevent()函式來等待串列埠上我們利用setcommmask ()函式設定的事件:

waitcommevent()

函式一直阻塞,直到串列埠上發生我們用所

setcommmask ()

函式設定的通訊事件為止。一般而言,當waitcommevent()返回時,程式設計師可以由分析*lpevtmask而獲得發生事件的類別,再進行相應的處理。

三、讀串列埠

在讀寫串列埠之前,還要用

purgecomm(…)

函式清空緩衝區

,該函式原型:

bool purgecomm(  

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

dword dwflags );   //需要完成的操作

引數dwflags

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

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

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

purge_txclear  清除輸出緩衝區

purge_rxclear  清除輸入緩衝區

對串列埠進行讀取所用的函式和對檔案進行讀取所用的函式相同,讀函式原型如下:

四、寫串列埠

對串列埠進行寫入所用的函式和對檔案進行寫入所用的函式相同,寫函式原型如下:

在進行同步操作時,讀寫函式要等到執行完才返回,而在

非同步操作時函式立即返回,但不保證讀寫操作完成,這時候就需要使用

結構進行非同步控制,該結構體有乙個重要的成員

hevent

,該成員是

windows

事件物件的控制代碼在控制線程同步及非同步操作時常用到,如果是非同步操作,我們可以使用

createevent

(…)建立事件物件並將返回值賦給

hevent

,然後使用

waitforsingleobject

或等待讀寫操作完成,進而達到控制非同步操作的目的。

五、關閉串列埠

利用api 函式實現串列埠通訊時關閉串列埠非常簡單,只需使用createfile 函式返回的控制代碼作為引數呼叫closehandle 即可:

bool closehandle(

handle hobject // handle to object to close

);

VC串列埠通訊程式設計

win32串列埠程式設計 韓耀旭 在工業控制中,工控機 一般都基於windows平台 經常需要與智慧型儀表通過串列埠進行通訊。串列埠通訊方便易行,應用廣泛。一般情況下,工控機和各智慧型儀表通過rs485匯流排進行通訊。rs485的通訊方式是半雙工的,只能由作為主節點的工控pc機依次輪詢網路上的各智慧...

VC 串列埠通訊程式設計詳解

總結來看串列埠通訊原理,也可以說大多數通訊原理也是如此 通訊首先要有個通訊,可以簡單的把通訊看成乙個小桶,傳送方住水桶裡裝水,接收方從水桶中取水。如果你要和對方通訊首先需要將桶蓋開啟,再將水裝入到桶中,這時接收方才能夠從桶中取到水。這裡就存在著一定的問題,1,如果桶蓋還沒有開啟,傳送方已經傳送了。這...

基於VC的接收機串列埠程式設計

序列介面是微機與外部裝置的主要通訊介面之一。只需要一條訊號線就可以進行單向資料傳送。由於線路簡單,相對較低,得到了廣泛應用。如果想利用序列介面來實現近距離通訊 通常15公尺以內 可以採用圖1的連線方式來實現。該接收機採用eia rs232c序列標準進行通訊,其資料通訊訊號形式如下表 波特率 baud...