張連環(huán) 曹竹梅
摘要:飛行模擬器具有可控性、經(jīng)濟(jì)性、可靠性等特點(diǎn),也在飛行人員培訓(xùn)中大量使用。在VS.net環(huán)境下采用多串口卡和CSerialPort類編寫的通信程序能夠滿足模擬器中上位機(jī)和多個(gè)下位機(jī)的實(shí)時(shí)通信要求,文章對其設(shè)計(jì)和實(shí)現(xiàn)方法進(jìn)行了闡述。
關(guān)鍵詞:串口擴(kuò)展;多串口通信;VS.net;CserialPort
中圖分類號:TP311文獻(xiàn)標(biāo)識碼: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
飛行模擬器是一種能比較逼真地復(fù)現(xiàn)飛機(jī)在空中的飛行狀態(tài)和環(huán)境的地面設(shè)備,是綜合人的視覺、聽覺信息、運(yùn)動(dòng)感覺信息的人在回路中的實(shí)時(shí)仿真系統(tǒng)。與真實(shí)飛機(jī)相比具有可控性、無破壞性、經(jīng)濟(jì)性、可靠性等特點(diǎn)。某型飛行模擬訓(xùn)練器系統(tǒng)中要求許多下位機(jī)同時(shí)跟一臺上位機(jī)進(jìn)行數(shù)據(jù)交換,以便能夠及時(shí)采集各控制面板的開關(guān)、電位器狀態(tài)和完成各儀表、顯示設(shè)備的驅(qū)動(dòng),而計(jì)算機(jī)一般所能提供的串口數(shù)量有限,就需完成要對串口進(jìn)行擴(kuò)展和通過各串口進(jìn)行數(shù)據(jù)交換的設(shè)計(jì)與實(shí)現(xiàn)。
1系統(tǒng)串口通信設(shè)計(jì)
32位下串口通信程序可以用多種方法實(shí)現(xiàn):使用較多的有MSComm控件、Win32API通信函數(shù)、CSerialPort類。
MSComm是微軟提供的串口編程控件,為應(yīng)用程序提供串口通信功能,功能較完善,使用方便。
Windows API是所有Windows應(yīng)用程序的根本。簡單地說,API就是一系統(tǒng)的例程,應(yīng)用程序通過調(diào)用這些例程來請求操作系統(tǒng)完成一些低級服務(wù)。調(diào)用Windows的API函數(shù),可以清楚地掌握串口通信的機(jī)制,并且自由靈活。
CserialPort類是Remon Spekreijse寫的一個(gè)串口類,是一個(gè)非常好用的多線程串口編程工具,它可以秀輕松的完成一般串口編程任務(wù)。
某型飛行模擬訓(xùn)練器系統(tǒng)中要求上位機(jī)同時(shí)和24個(gè)下位機(jī)通過串口進(jìn)行數(shù)據(jù)交換,使用API函數(shù)實(shí)現(xiàn)串口編程,方法靈活、功能強(qiáng)大,但需要編程人員對串口硬件工作原理有較深入了解;使用MSComm控件編程簡單,對付簡單的任務(wù)完全可以勝任,但當(dāng)需要在程序中用多個(gè)串口,且還要做很多復(fù)雜的處理,使用CserialPort類,很快就可搭好串口通信框架,編程者可以從煩心的框架編寫中解脫出來,將精力放在通信協(xié)議的編制及數(shù)據(jù)處理上。
在本飛行訓(xùn)練系統(tǒng)中,硬件采用工業(yè)多串口卡進(jìn)行串口擴(kuò)展,軟件基于VS.Net環(huán)境,采用CserialPort類進(jìn)行串口通信程序的編寫,基于RS-485標(biāo)準(zhǔn)來完成模擬訓(xùn)練器中多串口數(shù)據(jù)通信的功能。
2系統(tǒng)串口通信實(shí)現(xiàn)
2.1串口擴(kuò)展
串口擴(kuò)展在工控機(jī)上插三塊PCI接口8口串口擴(kuò)展卡,設(shè)置串口號為1~24,波特率設(shè)置為115200bps,與下位機(jī)一致。每個(gè)串口連接一特定設(shè)備。
2.2軟件編程
CserialPort類是基于多線程的,其工作流程如下:
1)在dataChange工程中添加SerialPort類文件
將類文件SerialPort.h和SerialPort.cpp復(fù)制到工程所在文件夾中,在工程中添加類文件,并在dataChangeView.h中包含頭文件:#include“SerialPort.h”
同時(shí)添加如下變量:
public:
CSerialPort m_serialPort[24]; //CSerailPort類對象
BOOL m_bSerialPortOpened[24]; //標(biāo)志串口是否打開
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();//啟動(dòng)串口監(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個(gè)串口的數(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ù)即可,為保證上位機(jī)對下位機(jī)進(jìn)行實(shí)時(shí)數(shù)據(jù)更新,添加WM_TIMER消息響應(yīng),每500ms向各串口定時(shí)發(fā)送數(shù)據(jù)。
void dataChangeView::OnTimer(UINT nIDEvent)
{
// TODO:在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值
for(int i=0; i<24; i++)
{
if(m_bSerialPortOpened[i])
dataUpdatePort(i);
}
CFormView::OnTimer(nIDEvent);
}
對應(yīng)的串口數(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é)束語
本文分析了幾種常用的實(shí)現(xiàn)串口通信的具體方法。最后通過串口卡擴(kuò)展串口,軟件在VS.net環(huán)境下使用CserialPort類編程基于RS-485標(biāo)準(zhǔn)進(jìn)行上位機(jī)與各下位機(jī)進(jìn)行數(shù)據(jù)通信。經(jīng)測試,系統(tǒng)運(yùn)行穩(wěn)定,該方案可以在同類多串口通信系統(tǒng)中借鑒。
參考文獻(xiàn):
[1]孫鑫.VC++編程深入詳解[M].北京:電子工業(yè)出版社,2006.
[2] [美]David J Kruglinski.Visual C++技術(shù)內(nèi)幕[M].潘愛民,王國印,譯.4版.北京:清華大學(xué)出版社,2009.
[3]侯俊杰.深入淺出MFC[M].2版.武漢:華中理工大學(xué)出版社,2001.
[4]龔建偉,熊光明.Visual C ++ /Turbo C串口通信編程實(shí)踐[M].北京:電子工業(yè)出版社,2007.
[5]葛姣,高清維.基于RS-485的多機(jī)串口通信網(wǎng)絡(luò)[J].安徽電子信息職業(yè)技術(shù)學(xué)院學(xué)報(bào), 2009,10(6).