Win32串列埠程式設計 轉韓耀旭

2022-10-31 04:00:05 字數 4322 閱讀 3520

vc串列埠通訊程式設計

(2009-07-08 13:48:40)

**▼標籤:

教育分類:學習充電

win32串列埠程式設計**:韓耀旭)

在工業控制中,工控機(一般都基於windows平台)經常需要與智慧型儀表通過串列埠進行通訊。串列埠通訊方便易行,應用廣泛。

一般情況下,工控機和各智慧型儀表通過rs485匯流排進行通訊。rs485的通訊方式是半雙工的,只能由作為主節點的工控pc機依次輪詢網路上的各智慧型控制單元子節點。每次通訊都是由pc機通過串列埠向智慧型控制單元發布命令,智慧型控制單元在接收到正確的命令後作出應答。

在win32下,可以使用兩種程式設計方式實現串列埠通訊,其一是使用activex控制項,這種方法程式簡單,但欠靈活。其二是呼叫windows的api函式,這種方法可以清楚地掌握串列埠通訊的機制,並且自由靈活。本文我們只介紹api串列埠通訊部分。

串列埠的操作可以有兩種操作方式:同步操作方式和重疊操作方式(又稱為非同步操作方式)。同步操作時,api函式會阻塞直到操作完成以後才能返回(在多執行緒方式中,雖然不會阻塞主線程,但是仍然會阻塞監聽執行緒);而重疊操作方式,api函式會立即返回,操作在後台進行,避免執行緒的阻塞。

無論那種操作方式,一般都通過四個步驟來完成:

(1)開啟串列埠

(2)配置串列埠

(3)讀寫串列埠

(4)關閉串列埠

(1)開啟串列埠

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

handle createfile( lpctstr lpfilename, dword dwdesiredaccess, dword dwsharemode, lpsecurity_attributes lpsecurityattributes, dword dwcreationdistribution, dword dwflagsandattributes, handle htemplatefile);

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

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

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

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

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

dwflagsandattributes:屬性描述,用於指定該串列埠是否進行非同步操作,該值為file_flag_overlapped,表示使用非同步的i/o;該值為0,表示同步i/o操作;

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

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

handle hcom; //全域性變數,串列埠控制代碼 hcom=createfile("com1",//com1口 generic_read|generic_write, //允許讀和寫 0, //獨佔方式 null, open_existing, //開啟而不是建立 0, //同步方式 null); if(hcom==(handle)-1) return true;

重疊i/o開啟串列埠的示例**:

handle hcom; //全域性變數,串列埠控制代碼 hcom =createfile("com1", //com1口 generic_read|generic_write, //允許讀和寫 0, //獨佔方式 null, open_existing, //開啟而不是建立 file_attribute_normal|file_flag_overlapped, //重疊方式 null); if(hcom ==invalid_handle_value) return true;

(2)、配置串列埠

在開啟通訊裝置控制代碼後,常常需要對串列埠進行一些初始化配置工作。這需要通過乙個dcb結構來進行。dcb結構包含了諸如波特率、資料位數、奇偶校驗和停止位數等資訊。

在查詢或配置串列埠的屬性時,都要用dcb結構來作為緩衝區。

一般用createfile開啟串列埠後,可以呼叫getcommstate函式來獲取串列埠的初始配置。要修改串列埠的配置,應該先修改dcb結構,然後再呼叫setcommstate函式設定串列埠。

dcb結構包含了串列埠的各項引數設定,下面僅介紹幾個該結構常用的變數:

typedef struct _dcb dcb; 檔案中定義了以上用到的常量。如下: #define noparity 0 #define oddparity 1 #define evenparity 2 #define onestopbit 0 #define one5stopbits 1 #define twostopbits 2 #define cbr_110 110 #define cbr_300 300 #define cbr_600 600 #define cbr_1200 1200 #define cbr_2400 2400 #define cbr_4800 4800 #define cbr_9600 9600 #define cbr_14400 14400 #define cbr_19200 19200 #define cbr_38400 38400 #define cbr_56000 56000 #define cbr_57600 57600 #define cbr_115200 115200 #define cbr_128000 128000 #define cbr_256000 256000

getcommstate函式可以獲得com口的裝置控制塊,從而獲得相關引數:

bool getcommstate( handle hfile, //標識通訊埠的控制代碼 lpdcb lpdcb //指向乙個裝置控制塊(dcb結構)的指標 ); setcommstate函式設定com口的裝置控制塊: bool setcommstate( handle hfile, lpdcb lpdcb );

除了在bcd中的設定外,程式一般還需要設定i/o緩衝區的大小和超時。windows用i/o緩衝區來暫存串列埠輸入和輸出的資料。如果通訊的速率較高,則應該設定較大的緩衝區。

呼叫setupcomm函式可以設定序列口的輸入和輸出緩衝區的大小。

bool setupcomm( handle hfile, // 通訊裝置的控制代碼 dword dwinqueue, // 輸入緩衝區的大小(位元組數) dword dwoutqueue // 輸出緩衝區的大小(位元組數) );

在用readfile和writefile讀寫序列口時,需要考慮超時問題。超時的作用是在指定的時間內沒有讀入或傳送指定數量的字元,readfile或writefile的操作仍然會結束。

要查詢當前的超時設定應呼叫getcommtimeouts函式,該函式會填充乙個commtimeouts結構。呼叫setcommtimeouts可以用某乙個commtimeouts結構的內容來設定超時。

讀寫串列埠的超時有兩種:間隔超時和總超時。間隔超時是指在接收時兩個字元之間的最大時延。

總超時是指讀寫操作總共花費的最大時間。寫操作只支援總超時,而讀操作兩種超時均支援。用commtimeouts結構可以規定讀寫操作的超時。

commtimeouts結構的定義為:

typedef struct _commtimeouts commtimeouts,*lpcommtimeouts;

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

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

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

可以看出:間隔超時和總超時的設定是不相關的,這可以方便通訊程式靈活地設定各種超時。

如果所有寫超時引數均為0,那麼就不使用寫超時。如果readintervaltimeout為0,那麼就不使用讀間隔超時。如果readtotaltimeoutmultiplier 和 readtotaltimeoutconstant都為0,則不使用讀總超時。

如果讀間隔超時被設定成maxdword並且讀時間係數和讀時間常量都為0,那麼在讀一次輸入緩衝區的內容後讀操作就立即返回,而不管是否讀入了要求的字元。

在用重疊方式讀寫串列埠時,雖然readfile和writefile在完成操作以前就可能返回,但超時仍然是起作用的。在這種情況下,超時規定的是操作的完成時間,而不是readfile和writefile的返回時間。

配置串列埠的示例**:

setupcomm(hcom,1024,1024); //輸入緩衝區和輸出緩衝區的大小都是1024 commtimeouts timeouts; //設定讀超時 //設定寫超時 setcommtimeouts(hcom,&timeouts); //設定超時 dcb dcb; getcommstate(hcom,&dcb); //波特率為9600 //每個位元組有8位 //無奇偶校驗位 //兩個停止位 setcommstate(hcom,&dcb); purgecomm(hcom,purge_txclear|purge_rxclear);

232 485串列埠通訊詳解

串列埠通訊詳解 一 rs 232 rs 232在1962年發布,命名為eia 232 e,作為工業標準,以保證不同廠家產品之間的相容。rs 232 c是美國電子工業協會eia electronic industry association 制定的一種序列物理介面標準。rs是英文 推薦標準 的縮寫,2...

ARM9串列埠積累

i o 輸入 輸出 empu嵌入式微處理器 mcu 微控制器 嵌入式微控制器 edsp嵌入式dsp處理器 soc 嵌入式片上系統 eda 電子設計自動化 risc reduced instruction set computer 精簡指令集計算機 rts cts協議 rts cts協議 reques...

9串列埠通訊指導書

目錄串列埠通訊原理 3 1 序列通訊基本概念 3 2 pic微控制器的序列介面 4 3 序列通訊介面硬體電路介紹 5 4 rs485硬體電路介紹 7 ex9.1 rs232通訊 8 ex9.2 rs485雙向通訊 10 串列埠通訊原理 1 序列通訊基本概念 計算機與外界的資訊交換稱為通訊。常用通訊方...