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