張連環(huán) 曹竹梅
摘要:飛行模擬器具有可控性、經(jīng)濟性、可靠性等特點,也在飛行人員培訓中大量使用。在VS.net環(huán)境下采用多串口卡和CSerialPort類編寫的通信程序能夠滿足模擬器中上位機和多個下位機的實時通信要求,文章對其設(shè)計和實現(xiàn)方法進行了闡述。
關(guān)鍵詞:串口擴展;多串口通信;VS.net;CserialPort
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2012)01-0026-02
The Design and Implementation of a Flight Simulator Multi-Serial Ports Communication
ZHANG Lian-huan1, CAO Zhu-mei2
(College of Information and Communication Engineering of Harbin Engineering University, Harbin 150056, China; 2. Naval Flying Academy, Huludao 125001, China)
Abstract: Flight Simulator has the characteristics of controllable, economy, reliability, etc, and is also widely used in flight personnel training. In VS.net environment, using multi-serial port card and communication program written by CSerialPort can meet upper position machine and many lower position machine communication requirement of real-time communication in simulator. The design and realization method are discussed in this paper.
Key words: serial port extension; multi-serial ports communication; VS.net; serialPort
飛行模擬器是一種能比較逼真地復現(xiàn)飛機在空中的飛行狀態(tài)和環(huán)境的地面設(shè)備,是綜合人的視覺、聽覺信息、運動感覺信息的人在回路中的實時仿真系統(tǒng)。與真實飛機相比具有可控性、無破壞性、經(jīng)濟性、可靠性等特點。某型飛行模擬訓練器系統(tǒng)中要求許多下位機同時跟一臺上位機進行數(shù)據(jù)交換,以便能夠及時采集各控制面板的開關(guān)、電位器狀態(tài)和完成各儀表、顯示設(shè)備的驅(qū)動,而計算機一般所能提供的串口數(shù)量有限,就需完成要對串口進行擴展和通過各串口進行數(shù)據(jù)交換的設(shè)計與實現(xiàn)。
1系統(tǒng)串口通信設(shè)計
32位下串口通信程序可以用多種方法實現(xiàn):使用較多的有MSComm控件、Win32API通信函數(shù)、CSerialPort類。
MSComm是微軟提供的串口編程控件,為應用程序提供串口通信功能,功能較完善,使用方便。
Windows API是所有Windows應用程序的根本。簡單地說,API就是一系統(tǒng)的例程,應用程序通過調(diào)用這些例程來請求操作系統(tǒng)完成一些低級服務。調(diào)用Windows的API函數(shù),可以清楚地掌握串口通信的機制,并且自由靈活。
CserialPort類是Remon Spekreijse寫的一個串口類,是一個非常好用的多線程串口編程工具,它可以秀輕松的完成一般串口編程任務。
某型飛行模擬訓練器系統(tǒng)中要求上位機同時和24個下位機通過串口進行數(shù)據(jù)交換,使用API函數(shù)實現(xiàn)串口編程,方法靈活、功能強大,但需要編程人員對串口硬件工作原理有較深入了解;使用MSComm控件編程簡單,對付簡單的任務完全可以勝任,但當需要在程序中用多個串口,且還要做很多復雜的處理,使用CserialPort類,很快就可搭好串口通信框架,編程者可以從煩心的框架編寫中解脫出來,將精力放在通信協(xié)議的編制及數(shù)據(jù)處理上。
在本飛行訓練系統(tǒng)中,硬件采用工業(yè)多串口卡進行串口擴展,軟件基于VS.Net環(huán)境,采用CserialPort類進行串口通信程序的編寫,基于RS-485標準來完成模擬訓練器中多串口數(shù)據(jù)通信的功能。
2系統(tǒng)串口通信實現(xiàn)
2.1串口擴展
串口擴展在工控機上插三塊PCI接口8口串口擴展卡,設(shè)置串口號為1~24,波特率設(shè)置為115200bps,與下位機一致。每個串口連接一特定設(shè)備。
2.2軟件編程
CserialPort類是基于多線程的,其工作流程如下:
1)在dataChange工程中添加SerialPort類文件
將類文件SerialPort.h和SerialPort.cpp復制到工程所在文件夾中,在工程中添加類文件,并在dataChangeView.h中包含頭文件:#include“SerialPort.h”
同時添加如下變量:
public:
CSerialPort m_serialPort[24]; //CSerailPort類對象
BOOL m_bSerialPortOpened[24]; //標志串口是否打開
BYTE inputBuff[24][12];//按Port口(0-24)接收數(shù)據(jù)
2)串口初始化
在OnInit函數(shù)中完成串口的初始化,
void dataChangeView::OnInit()
{
// TODO:在此添加控件通知處理程序代碼
for(int i=0; i<24; i++)
if(m_serialPort[i].InitPort(this,i+1,115200,N,8,1,EV_RXFLAG | EV_RXCHAR,512)){
m_serialPort[i].StartMonitoring();//啟動串口監(jiān)視線程
m_bSerialPortOpened[i]=TRUE;
}
else
{
Cstring strTemp;
strTemp.Format(“COM%d沒有發(fā)現(xiàn),或被其它設(shè)備占用”,i+1);
AfxMessageBox(strTemp);
3)建立WM_COMM_RXCHAR的消息映射處理函數(shù)OnCommunication()完成數(shù)據(jù)的接收。LONG dataChangeView::OnCommunication(WPARAM ch, LPARAM port)
{…
Switch(port)
{
case 1:
device01DataReceive(ch,port);//串口1設(shè)備的數(shù)據(jù)接收breek;
…
case 24:
device24DataReceive(ch,port);//串口24設(shè)備的數(shù)據(jù)接收breek;
然后根據(jù)通信協(xié)議具體要求分別寫出24個串口的數(shù)據(jù)接收函數(shù)
void dataChangeView:: device01DataReceive(WPARAM ch, LPARAM port)
…
void dataChangeView:: device24DataReceive(WPARAM ch, LPARAM port)
4)發(fā)送數(shù)據(jù)調(diào)用函數(shù)WriteToPort()直接向串口寫數(shù)據(jù)即可,為保證上位機對下位機進行實時數(shù)據(jù)更新,添加WM_TIMER消息響應,每500ms向各串口定時發(fā)送數(shù)據(jù)。
void dataChangeView::OnTimer(UINT nIDEvent)
{
// TODO:在此添加消息處理程序代碼和/或調(diào)用默認值
for(int i=0; i<24; i++)
{
if(m_bSerialPortOpened[i])
dataUpdatePort(i);
}
CFormView::OnTimer(nIDEvent);
}
對應的串口數(shù)據(jù)更新函數(shù):
void dataChangeView::dataUpdatePort(int nPortNum)
{
Switch(nPortNum)
{
case 1:
char data[512];
int len=Str2Hex("…",data);
m_serialPort.WriteToPort(data,len);
break;
…
case 24:
…
Break;
}}
3結(jié)束語
本文分析了幾種常用的實現(xiàn)串口通信的具體方法。最后通過串口卡擴展串口,軟件在VS.net環(huán)境下使用CserialPort類編程基于RS-485標準進行上位機與各下位機進行數(shù)據(jù)通信。經(jīng)測試,系統(tǒng)運行穩(wěn)定,該方案可以在同類多串口通信系統(tǒng)中借鑒。
參考文獻:
[1]孫鑫.VC++編程深入詳解[M].北京:電子工業(yè)出版社,2006.
[2] [美]David J Kruglinski.Visual C++技術(shù)內(nèi)幕[M].潘愛民,王國印,譯.4版.北京:清華大學出版社,2009.
[3]侯俊杰.深入淺出MFC[M].2版.武漢:華中理工大學出版社,2001.
[4]龔建偉,熊光明.Visual C ++ /Turbo C串口通信編程實踐[M].北京:電子工業(yè)出版社,2007.
[5]葛姣,高清維.基于RS-485的多機串口通信網(wǎng)絡[J].安徽電子信息職業(yè)技術(shù)學院學報, 2009,10(6).