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