VC串列埠通訊win32SDK版

2021-08-26 16:06:08 字數 2331 閱讀 4445

vc串列埠通訊win32sdk版

2023年05月14日

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

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

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

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

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

(1) 開啟串列埠

(2) 配置串列埠

(3) 讀寫串列埠

(4) 關閉串列埠

(1) 開啟串列埠

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

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

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

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

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

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;

(2)、 配置串列埠

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

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

dcb結構包含了串列埠的各項引數設定,下面僅介紹幾個該結構常用的變數: typedef struct _dcb return true; //同步寫串列埠 char lpoutbuffer[100]; dword dwbyteswrite=100; comstat comstat; dword dwerrorflags; bool bwritestat; clearcommerror(hcom,&dwerrorflags,&comstat); bwritestat=writefile(hcom,lpoutbuffer,dwbyteswrite ,& dwbyteswrite,null); if(!bwritestat) purgecomm(hcom, purge_txabort| purge_rxabort|purge_txclear|purge_rxclear);

在重疊操作時,操作還未完成函式就返回。

對以上**再作簡要說明:在使用readfile 函式進行讀操作前,應先使用clearcommerror函式清除錯誤。clearcommerror函式的原型如下: 該函式獲得通訊錯誤並報告串列埠的當前狀態,同時,該函式清除串列埠的錯誤標誌以便繼續輸入、輸出操作。

引數lpstat指向乙個comstat結構,該結構返回串列埠狀態資訊。 comstat結構 comstat結構包含串列埠的資訊,結構定義如下: typedef struct _comstat comstat, *lpcomstat;

(4)、 關閉串列埠

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

bool closehandle(

handle hobject; //handle to object to close

);

Win32 SDK學習筆記3

1 思考一下,視窗程式中為什麼要註冊視窗類?你想建立什麼樣的視窗呢?那麼,建立什麼樣的視窗呢?建立前,window系統可不知道你要的是什麼型別的視窗啊 比如標題欄上顯示什麼圖示,滑鼠形狀是什麼,視窗背景顏色等等 這些型別資訊應在你建立前事先告訴window系統。可以採用這種方法 就是我們事先寫乙份要...

win32 sdk繪製矩形選擇框

普通的繪製會留下 痕跡 但windows程式設計第五版的5.3.8節提到了乙個繪圖模式的概念.具體內容就是我們可以通過呼叫setrop2函式對繪圖模式的設定,預設是r2 copypen,即畫筆畫素覆蓋背景畫素.注意這裡是對畫筆的繪圖模式進行設定,對畫刷沒用影響,所以只能老實的用線條畫矩形 setro...

WPF 通過Win32SDK修改視窗樣式

使用函式為 setwindowlong getwindowlong 註冊函式 dllimport user32.dll entrypoint getwindowlong public static extern int getwindowlong intptr hwnd,int nindex dll...