深入淺出VC 串列埠程式設計 基於控制項

2021-05-25 09:49:57 字數 2526 閱讀 1476

visual c++為我們提供了一種好用的activex控制項microsoft communications control(即mscomm)來支援應用程式對串列埠的訪問,在應用程式中插入mscomm控制項後就可以較為方便地實現對通過計算機串列埠收發資料。

要使用activex控制項mscomm,程式設計師必須將其新增入工程,其方法是:

(1)單擊主選單project的子選單add to project的components and controls選項;

(2)在彈出的"components and controls gallery"對話方塊中選擇registered activex controls資料夾中的"microsoft communications control,version 6.0"選項,如下圖:

單擊其中的"insert"按鈕,mscomm控制項就被增加到工程中了。與此同時,類cmscomm的相關檔案mscomm.h和mscomm.cpp也一併被加入project的header files和source files中。當然,程式設計師可以自己修改檔名,如下圖:

直接分析mscomm.h標頭檔案就可以完備地獲取這個控制項的使用方法(主要是public型別的介面函式),下面我們摘取了標頭檔案的主要**並對其關鍵部分給出了注釋:

分析上述源**可知,基本上,mscomm的諸多介面可以分為如下幾類:

(1)開啟與設定串列埠介面函式;

(2)獲得串列埠設定和串列埠狀態介面函式;

(3)設定串列埠傳送資料方式、緩衝區介面及傳送資料介面函式;

(4)設定串列埠接收資料方式、緩衝區介面及接收資料介面函式;

(5)設定與獲取串列埠上發生的事件介面函式。

2.例程

程式的功能和介面(如下圖)都與本文**三中《基於win32 api的串列埠程式設計

》相同,不同的只是**三的串列埠通訊以api實現,而本節的串列埠通訊則以mscomm控制項實現。

使用第1節的方法將控制項新增入工程並新增mscomm.h和mscomm.cpp檔案後,為了使用控制項,我們將控制項拖入對話方塊內任意乙個位置(執行時"**"圖示會隱藏),其操作如下圖:

有趣而極富人性化的是我們可以直接右鍵單擊這個"**",來設定串列埠的屬性,如下圖:

接著,我們需要為控制項新增乙個對應的成員變數m_mscom,其對應的變數型別為cmscomm,如下圖:

這樣就建立了m_mscom和idc_mscomm1控制項的相互對映:

void cserialportactivexdlg::dodataexchange(cdataexchange* pdx)

}afx_data_map}

同時,在對話方塊的標頭檔案也會由"mfc類嚮導"自動定義cserialportactivexdlg類的cmscomm型成員變數m_mscom:

cmscomm m_mscom;

在對話方塊初始化時(即在cserialportactivexdlg::oninitdialog函式中)開啟串列埠1:

最核心的傳送串列埠資料函式("傳送"按鈕單擊事件)如下:

void cserialportactivexdlg::onsendbutton()

}afx_msg

同時在對話方塊的.cpp檔案中會增加下列**實現串列埠訊息對映:

begin_eventsink_map(cserialportactivexdlg, cdialog)

//}afx_eventsink_map

end_eventsink_map()

我們定義cserialportactivexdlg::oncommmscomm1()函式主要處理資料的接收,其源**為:

void cserialportactivexdlg::oncommmscomm1()

rxdata[i] = '/0';

}m_recv += rxdata;

updatedata(false);

break;

default:

break;}}

最後,與**三類似,再次借助"串列埠除錯助手"以例項驗證了本程式的正確性,如下圖:

在mainfrm.h標頭檔案中加入:

afx_msg void oncommmscomm();

declare_eventsink_map()

並定義cmscomm成員變數:

cmscomm m_comport;

在mainfrm.cpp檔案中新增

begin_eventsink_map(cmainframe, cframewnd)

on_event(cmainframe,id_commctrl,1,oncommmscomm,vts_none)

//對映activex控制項的事件

end_eventsink_map()

在mainfrm.cpp檔案的oncreate(lpcreatestruct lpcreatestruct)函式中新增:

comport.create(null, ws_visible | ws_child, crect(0,0,0,0),this, id_commctrl);

以建立cmscomm控制項。

此後,我們就可以在cmainframe類的函式中使用串列埠控制項對應的comport控制項成員變數。

深入淺出VC 串列埠程式設計之基於Win32 API

1 api描述 在win32 api中,串列埠使用檔案方式進行訪問,其操作的api基本上與檔案操作的api一致。開啟串列埠 win32 中用於開啟串列埠的api 函式為createfile,其原型為 例如,以下程式用於以同步讀寫方式開啟串列埠com1 handle hcom dword dwerro...

深入淺出VC 串列埠程式設計之基於Win32 API

1 api描述 在win32 api中,串列埠使用檔案方式進行訪問,其操作的api基本上與檔案操作的api一致。開啟串列埠 win32 中用於開啟串列埠的api 函式為createfile,其原型為 例如,以下程式用於以同步讀寫方式開啟串列埠com1 handle hcom dword dwerro...

深入淺出VC 串列埠程式設計之基於Win32 API

1 api描述 在win32 api中,串列埠使用檔案方式進行訪問,其操作的api基本上與檔案操作的api一致。開啟串列埠 win32 中用於開啟串列埠的api 函式為createfile,其原型為 例如,以下程式用於以同步讀寫方式開啟串列埠com1 handle hcom dword dwerro...