介紹了串行通訊的基本原理,以及在Win98,Win2000環(huán)境下實現(xiàn)串行通訊的三種方法,并給出了用Visual
C++6.0編寫的相應(yīng)的應(yīng)用程序。
關(guān)鍵詞:VC,串行通訊,CserialPort類,Win A
PI
?
隨著計算機(jī)系統(tǒng)的應(yīng)用和
微機(jī)網(wǎng)絡(luò)的發(fā)展,計算機(jī)同外設(shè)間的通訊功能越發(fā)顯得重要。其中,串行通訊因具有連接簡單、使用靈活方便、數(shù)據(jù)傳遞可靠等優(yōu)點,在
工業(yè)監(jiān)控、數(shù)據(jù)采集和實時控制系統(tǒng)中得到了廣泛的應(yīng)用。
1 串行通訊的基本原理
所謂“串行通訊”是指外設(shè)和計算機(jī)間使用了數(shù)據(jù)線、控制線和地線,數(shù)據(jù)在數(shù)據(jù)線上一位一位地進(jìn)行傳輸,每一位數(shù)據(jù)都占據(jù)一個固定的時間長度。這種通訊方式使用的數(shù)據(jù)線少,在遠(yuǎn)距離通訊中可以節(jié)約通訊成本,當(dāng)然,其傳輸速度比并行傳輸慢。計算機(jī)與外部設(shè)備進(jìn)行數(shù)據(jù)交換往往采用
RS-232進(jìn)行接收,上傳數(shù)據(jù)和指令,如圖1所示。
?
?
在Windows環(huán)境(Win98、Windows2000)下,串口是系統(tǒng)資源的一部分。應(yīng)用程序要使用串口進(jìn)行通訊,必須在使用之前向
操作系統(tǒng)提出資源申請要求,即打開串口,通訊完成后必須釋放資源,即關(guān)閉串口。
2 利用MSComm控件
2.1 簡介MSComm控件
MSComm控件在
編程時非常方便,而且在VC、VB、Delphi等語言中均可使用。MSComm是Microsoft
公司提供的簡化Windows串行通訊編程的
ActiveX控件,它為應(yīng)用程序提供了處理串行通訊的兩種方法:一是數(shù)據(jù)驅(qū)動方法,一是查詢法。
2.2 編程實現(xiàn)
在使用MSComm控件開發(fā)失重秤采樣顯示的程序中,采用了事件驅(qū)動法,這種方法是在接收到數(shù)據(jù)時觸發(fā)事件并獲取緩沖區(qū)的數(shù)據(jù),下面是其實現(xiàn)程序:
第一步,利用MFC向?qū)Ы⒒趯υ捒虻膽?yīng)用程序CcommDlg,在項目中插入Mscomm控件。
第二步,初始化MSComm控件的
參數(shù),現(xiàn)場采樣與計算機(jī)進(jìn)行串口通訊時采用8個數(shù)據(jù)位、1個停止位,無校驗,波特率9600。其中,編輯框m_
sDisplay用來顯示所得數(shù)據(jù),數(shù)據(jù)以*開始,以$結(jié)束,主要如下:
??? 首先,要在CCommDlg.h頭文件中包含#include“MSComm.h”,在類中定義publ
ic CMSComm m_
第三步,對話框建立響應(yīng)MSComm事件的處理函數(shù),每當(dāng)MSComm控件觸發(fā)事件時該函數(shù)將被調(diào)用。這個函數(shù)是用來處理串口消息事件的,每當(dāng)串口接收到數(shù)據(jù),就會產(chǎn)生一個串口接收數(shù)據(jù)的消息事件,我們在OnComm()函數(shù)中加入響應(yīng)的處理代碼就能實現(xiàn)自己想要的功能了:
}//當(dāng)然這只是個非常簡單的示例,我們可以在這里假如我們需要的復(fù)雜的通訊任務(wù)
}
第四步,發(fā)送數(shù)據(jù),先加入一個處理函數(shù),在事件中加入如下的程序,其中,m_strSend是所要發(fā)送的Cstring變量。在處理函數(shù)中加入:
3 利用CserialPort類進(jìn)行串口通訊
3.1 選用CserialPort類
的確,使用MSComm控件非常方便,但如果要控制復(fù)雜的系統(tǒng),需要使用多個串口,MSComm控件就有許多不便,這種情況我們就可以選用CserialPort類,這是rimon spekreijse寫的一個串口類,可以從下面網(wǎng)址
下載:
??????? http://codeguru.earthweb.com.netw
ork.serialport.shtml
3.2 編程實現(xiàn)
同樣,我們用開發(fā)失重秤采樣顯示的程序來說明怎樣使用此類,數(shù)據(jù)通訊的過程也使用了起始標(biāo)志*和結(jié)束標(biāo)志$。
第一步,建立一個基于單文檔的MFC應(yīng)用程序CcommView,將CserialPort.h和CserialPort.cpp兩個類文件復(fù)制到工程文件夾中,用project-
add to project-files命令將上述兩個文件加入工程。并在CcommView.h中將頭文件中包涵文件CserialPort.h,#include”SerialPort.h”;
第二步,人工增加串口消息響應(yīng)函數(shù):OnCommunication(WPA
RAM ch.LPARAM port)
首先,在CcommView.h中加入串口接收的響應(yīng)函數(shù)聲明,由于沒有自動的消息映射機(jī)制,我們必須在消息映射機(jī)制的標(biāo)志處手工添加:
4 使用API通訊函數(shù)
4.1 用Win API函數(shù)對串口進(jìn)行操作
在Win API函數(shù)中對串口進(jìn)行操作不是對
端口進(jìn)行直接讀寫的,而是把所有的設(shè)備都看成是文件,從而進(jìn)行相應(yīng)的文件操作。
4.2 編程實現(xiàn)
??????? 第一步,在MainFrm.cpp定義全局變量HANDLE hCom;//準(zhǔn)備打開的串口的句柄HANDLE hCommWatchThread;//輔助線程的全局函數(shù)
??? 第二步,打開串口,設(shè)置串口hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRI
TE,NULL,OPEN_EXISTING,F(xiàn)ILE_FLAG_OVERLAPPED,NULL);//這里,我們使用FILE_FLAG_OVERLAPPED結(jié)構(gòu),這正是使用API函數(shù)實現(xiàn)非阻塞通訊的關(guān)鍵所在。
第三步,啟動一個輔助線程,用于串口事件的處理。這里用它來監(jiān)視串口狀態(tài),主線程則可專心進(jìn)行數(shù)據(jù)處理。
5 結(jié)束語
VC開發(fā)系統(tǒng)從底層到上層直接面向用戶,而且具有強(qiáng)大的調(diào)試功能,因此,越來越多地被廣大的
程序員使用。過程控制領(lǐng)域中,和串口打交道是不可避免的,用這三種方式基本可以完成串口通訊的問題,但我們要根據(jù)不同的需要選用不同的方法,使我們的程序精巧且實用,這三種方法在我們的失重秤測控系統(tǒng)、齒輪箱扭矩監(jiān)控系統(tǒng)和心電儀設(shè)備的初步研究中都一一得到了驗證。
?
參考文獻(xiàn)
?
1 David J.Kruglinski.Visual C++技術(shù)內(nèi)幕.北京:清華大學(xué)出版社,1999
2 Kate Gregory.Visual C++開發(fā)使用手冊.北京:
機(jī)械工業(yè)出版社,1999
3 鄧華,毛巖,吉正.Visual C++案例
教程.中科多媒體
電子出版社,1999
4 (美)Marshall Br
aint,Lance Lovette.MFC開發(fā)人員指南.北京:機(jī)械工業(yè)出版社,2000
5 姚燕南,薛勻義.微機(jī)原理.西安:西安電子科技大學(xué)出版社,1998
評論
查看更多