VC++下串行通信的編程方法 張 力 呂振肅 趙慶林 1 引言
串行通信程序是微機監(jiān)控軟件中基礎(chǔ)、關(guān)鍵的一個環(huán)節(jié),如何有效地開發(fā)通信程序,是軟件開發(fā)人員所關(guān)心的話題。Microsoft公司從1993年推出VC++1.0開始,不斷升級,從
VC++1.52到目前最新的
VC++5.0,擁有大量的用戶,用VC++開發(fā)串行通信程序也隨版本的不同各有特點。本文詳細(xì)地介紹了用VC編寫通信程序的兩種方法: 2 用API函數(shù)實現(xiàn)串行通信 API函數(shù)是Windows程序開發(fā)使用的主要函數(shù)集,其中提供了十幾個專門的通信函數(shù)。對應(yīng)Windows3.x和Win95及 NT開發(fā)環(huán)境,有16位和32位通信API函數(shù),VC++ 2.0和以前的版本都保持16位和32位兩個版本,從 VC++4.0 以后,軟件只支持32位應(yīng)用程序的開發(fā)。目前較多的應(yīng)用是在Win95及NT的32位開發(fā)環(huán)境下,但也存在著Windows3.x下開發(fā)的16位通信程序向32位程序的移植問題;谶@種考慮,16位通信函數(shù)也列舉出來。 2.1 主要通信函數(shù)的對比 32位通信函數(shù)與16位函數(shù)的主要區(qū)別在于,32位API函數(shù)把對通信口的操作當(dāng)作一個普通文件。這是因為在Windows95和NT下,WM—COMMNOTIFY消息已被取消,操作系統(tǒng)已將通信設(shè)備封裝起來了,系統(tǒng)為每個通信設(shè)備定義了用戶可定義大小的讀/寫緩沖區(qū),應(yīng)用程序只對讀/寫緩沖區(qū)操作,而不用和通信驅(qū)動程序打交道。 2.2 用API函數(shù)編程的過程 首先由應(yīng)用向?qū)ВˋppWizard)生成程序的主框架。在集成開發(fā)環(huán)境下選File/New菜單(以VC5.0為例),彈出New對話框,單擊project標(biāo)簽后選MFC AppWizard (exe)項,在創(chuàng)建的第一步選中單文檔,其他五步接受缺省選項,只需編輯生成的視類.cpp文件即可?梢杂脙煞N方法編程:一種是利用Windows的 WM—COMMNOTIFY消息,映射出該消息的處理函數(shù),通信編碼就放在該函數(shù)中,這主要適用于VC2.0及以前的版本 ;另一種方法是直接在.CPP文件中編寫通信部分,把通信當(dāng)作視類的成員函數(shù)。不論用哪種方法,編程思路是相同的:設(shè)置初始化并打開串口—配置串口—在雙方間傳輸數(shù)據(jù),并進(jìn)行校驗等處理—不需要時釋放串口,供其他程序使用。 2.3 注意事項 在Windows 3.x
中,有專門的消息WM—COMMNOTIFY用于通信。在Windows95和NT下,該消息已被取消,但用戶也可以用自定義的WM—COMMNOTIFY消息,這時要注意消息映射的聲明必須如下: 3 用OLE通信控件實現(xiàn)串行通信 用VC++的OLE控件實現(xiàn)串行通信,是一種簡潔的編程方法。VC4.0版和VC5.0版所提供的通信控件略有不同,下面針對這兩個版本,對OLE通信控件做具體介紹。 3.1 通信控件的插入 在VC++4.0 下,首先生成一個項目,或者打開一個存在的項目。選擇菜單Insert/Component…,出現(xiàn)Component Gallery窗口,選中OLE Controls下的Microsoft CommControl,雙擊就將控件嵌入到項目文件中了。在VC++5.0下,選菜單Project/Add To Project,將會有一子菜單, 選中 Component and Controls項(注意如果沒有打開項目,Component項不會出現(xiàn)在子菜單項中),接著雙擊Registered ActiveX Controls,在其中會找到通信控件5.0,雙擊之便可插入。此時打開對話框編輯器,在工具條中會看到新增的通信控件。 3.2 在程序中使用通信控件 象所有其他OLE控件一樣,通信控件也是用一系列的屬性和用戶接口,用戶用Get…函數(shù)得到屬性的當(dāng)前值,用
Set…函數(shù)設(shè)置屬性值?丶峁┝27個屬性,大部分屬性僅和Modem連接有關(guān),現(xiàn)將常用的屬性列舉如下: 3.3 其它注意事項 VC4.0下和VC5.0下Input屬性的返回值不同。在 VC4.0下Input 返回的是CString類,而在VC5.0下,返回 COleVariant類。COleVariant類封裝了VARIANT數(shù)據(jù)類型,該結(jié)構(gòu)也是Output屬性所要求的類型。要用好控件就必須了解 VARIANT結(jié)構(gòu), 該結(jié)構(gòu)囊括了所有常用的簡單數(shù)據(jù)類型。但是結(jié)構(gòu)中每次可用的數(shù)據(jù)類型只有一種,由結(jié)構(gòu)的成員vt識別。例如對字符串bstrVal,vt=8,對short類型,vt=2等等。同時注意到VC5.0控件增加了 InputMode屬性,提供兩種輸入模式:文本和二進(jìn)制。兩種方式?jīng)Q定了Input接收的兩種數(shù)據(jù)類型。在文本方式下,Input返回值在成員bstrVal中,類型為vt=8,這和VC4.0下返回CString類是相同的。在二進(jìn)制模式下,Input接受值在安全數(shù)組parray中,類型為 vt=0x2000 ,這是編程時容易忽略的地方。一般上下位機通信時,下位機的數(shù)據(jù)是以16進(jìn)制形式存放,編寫通信程序建議選擇二進(jìn)制輸入模式。用文本模式就必須在編碼時仔細(xì)考慮,否則容易丟失數(shù)據(jù)。另外,用事件驅(qū)動方法編程時還應(yīng)注意,OnComm事件在通信事件或錯誤發(fā)生時都會激發(fā), 在處理函數(shù)中應(yīng)將各種可能的情況列舉出來分別處理,很重要的一點是及時處理通信錯誤。 4 結(jié)束語 總而言之,比起繁多的API函數(shù),通信控件不失為一種簡潔有效的實現(xiàn)串行通信的途徑。只要掌握好控件的屬性,就能輕松地編寫通信程序。筆者在編寫一套電力系統(tǒng)的實時監(jiān)控軟件時,用VC++5.0下的通信控件成功地實現(xiàn)了微機與下位機——3720ACM 儀表之間的通信,該儀表是加拿大PML公司生產(chǎn)的高級電力綜合監(jiān)控儀表。 張 力 碩士研究生。研究方向:計算機控制與信息工程。 呂振肅 碩士,教授。從事計算機控制與信息工程、CAD等方面的教學(xué)與研究工作!趙慶林 碩士研究生。研究方向:計算機控制與信息工程。 作者單位: 蘭州大學(xué)電子與信息科學(xué)系 甘肅.蘭州(730000) 參考文獻(xiàn)
。1]。勖溃軲icrosoft
Corporation.Microsoft Win32程序員參考大全(二). 北京:清華大學(xué)出版社,1995
|