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...