船载天线串口数据采集系统的设计与实现

2016-02-23 06:23张海洋
计算机技术与发展 2016年1期
关键词:控件线程对话框

张海洋

(南京邮电大学 通信与信息工程学院,江苏 南京 210000)

船载天线串口数据采集系统的设计与实现

张海洋

(南京邮电大学 通信与信息工程学院,江苏 南京 210000)

在船载卫星通信系统中,天线控制系统通过串口连接上位机,由上位机控制天线对星,再将数据回送PC上的控制监测软件界面来控制及采集处理保存数据,实现对天线对星情况和天线姿态的观测和调整,以便快速准确对星。文中以设计图形界面为起点,具体阐述了利用C++语言和MFC设计PC端利用USB端口实现天线串口数据采集的多线程人机交互界面,并使用GDI绘图函数在PC界面上实现同步准确的关键参数时间变化图的真实再现。其中关键参数包括自动增益控制(AGC)、天线姿态等,以及采用Access数据库来保存数据记录,以备查询和评估。结果表明,该软件符合实际标准且运行稳定,并能反映天线、船和卫星的实时状态数据和动作图像。目前已广泛应用于船载“动中通”卫星通信系统的监控和测试,并且获得了良好的界面交互环境。

MFC;船载卫星通信系统;AGC;天线姿态;串口通信;多线程;临界区;数据库;图像保存

0 引 言

船载卫星天线系统中,最基本的要求是能够完成对星,以便能够通过卫星收发数据。AGC和天线姿态参数,包括天线方位角、俯仰角和极化角参数是完成对星和准确对星的基本指标。AGC即自动增益控制,其数值的大小直观反映了天线接收信号的强弱。天线姿态则反映当前天线在三维坐标系与各轴角度差,对星时其天线各方向的角度与同步卫星经度和所在地区的经纬度有关。当AGC高于某个门限且天线姿态与理论参数偏差不大的时候,就认为某颗卫星对星成功[1]。数据采集软件对下位机直接或者通过上位机间接发回的数据流,依照协议字进行接收处理,实现天线实时状态的显示和AGC电平、天线姿态等图像的动态绘制,直观评估出天线对星情况。

1 串口通信

传统的界面串口使用Activex控件MSComm,是微软库自带的控件类,其优点是操作简单,满足简单的串口通信要求。但其在多线程一般的表现和难于操作,给设计人员带来不便。文中系统兼顾硬件扩展多串口问题及移植性,采用了成熟的多线程CSerialPort类进行串口编程[2]。

CSerialPort类工作流程及其接口表示为:

(1)初始化串口接口:InitPort(参数),可以设置串口号、波特率等。

(2)启动线程接口:StartMonitoring(),用来启动线程CommThread,相当于打开串口。文中系统界面将(1)、(2)接口封装在一个open()接口函数里,简化调用。

(3)接收数据接口:ReceiveChar(参数),通过全局API函数向数据采集界面发送WM_COMM_RXCHAR消息和数据,完成数据接收。

(4)发送数据接口:WriteChar(参数),类似上述。

(5)关闭串口接口:ClosePort(),退出线程,实现串口关闭。

2 通信系统组成

船载卫星通信系统硬件实现是通过上位机由天线串口转发给PC机数据流,实时接收到PC缓存区,实现天线姿态的在PC在线回显和AGC动态绘制。当对星成功后,天线接收的信号经LNB本振降频送到经PC调节的频谱仪,显示出信号的峰值波形,并且PC经GPIB-USB线或者LAN口采集处理并存储天线方向图[3]。系统的组成如图1所示。

图1 船载卫星通信系统的简单示意图

3 串口的数据采集软件实现

数据采集界面采用Visual Studio 2010软件中MFC工程设计实现,建立了多个对话框类,功能包括主对话框对串口相关参数的设置、天线状态的动态显示和AGC等参量的图像绘制,其余副对话框分别负责天线控制,比如选星参数设置、手动控制天线转动、PID参数设置、画框搜索参数设置、陀螺仪参数设置等及其确保全部参数正确设置的由天线串口发送设置的参数的回显,以及天线部分实时状态显示的CSetDlg类;对频谱分析仪基于VISA的通过TCP-IP或者GPIB-USB传送SCPI命令来控制虚拟仪器控制和采集数据、天线方向图读取处理的子对话框CAntTest类;对采集到的图像进行浏览、放大、缩小、删除处理等功能的子对话框CScanPic类,以及数据库类CDatabase等。整体软件的控制采集测试界面类关系如图2所示。下面详细介绍对于串口数据采集处理部分软件的实现[4]。

图2 船载数据采集测试软件的类关系

数据采集软件使用串口COM6,波特率19 200 Baud,无校验位,8个数据位和1个停止位。串口的采集通过串口类每接收1个字符就向主对话框发送WM_COMM _RXCHAR消息,并将数据附加在消息中,所以需要主对话框类CTestingDlg的cpp实现文件中加入消息映射ON_MESSAGE()及自行定义的WM_COMM_RXCHAR消息响应函数OnPortRecieved(WPARAM ch,LPARAM po),通过参数ch得到发送的单字符,使用累加形成字符串进行处理。主对话框类CTestingDlg.h加入两个共有的成员变量:

CString m_ReceiveBuf_Copy;

CString m_ReceiveBuf;

//消息响应函数中字符的累加处理

CStringstrTemp_Copy=_T("");

strTemp_Copy.Format(_T("%s%c"),m_ReceiveBuf_Copy,ch);

m_ReceiveBuf_Copy=strTemp_Copy;

m_ReceiveBuf=m_ReceiveBuf_Copy;

上述变量中,m_ReceiveBuf负责处理绘图,实现主对话框主线程绘图;m_ReceiveBuf_Copy负责其他对话框获取数据的赋值变量,完成主对话框的子线程和子对话框的子线程状态回显的异步采集处理[5]。

为了防止读取写入冲突,需要通过设置临界区来保护累加的中间变量,实现不同界面可以同时处理接收的字符流。以下代码定义并初始化临界区成员变量。

//CTesting.h文件

CRITICAL_SECTION g_cs;

//CTesting.cpp文件

InitializeCriticalSection(&g_cs);

子类对话框线程使用以下代码获得主对话框临界区变量。

//CSetDlg.cpp或者CTesting.cpp文件中的子线程函数

CTestingDlg*pTestingDlg=(CTestingDlg*)AfxGetApp()->m_pMainWnd;

LPCRITICAL_SECTION lpg_cs=& (pTestingDlg->g_cs);

获得主对话框临界区成员变量后,主对话框和子对话框的子线程就可以用以下代码获得接收的数据流。

CString RecieveBuf;//负责复制接收的字符流

while(1)

{

EnterCriticalSection(&g_cs);

RecieveBuf=pTestingDlg->m_ReceiveBuf_Copy;

LeaveCriticalSection(&g_cs);

...//(RecieveBuf的处理代码)

}

文中系统天线AGC电平值协议字格式为“g****”,其中,****代表0~9任意数字,数字扩大1 000倍,如g1234表示AGC电平为1.234 V,精确到小数点后3位。天线姿态有类似的表示方式,如天线的绝对方位,也就是相对地球的方向,因为在实际船载系统中天线方向随船摇动,而天线方位由码盘计算,而码盘只根据与船头相对角度差来计算,所以也加入了相对船头的相对方位,直观反映天线在船体中的相对指向[6]。天线绝对方位角,用协议字“A*****”,俯仰角“E*****”,精确到小数点后2位,船头角“H****”,精确到小数点后1位。其他参数类似[7]。

处理函数为字符串的处理,包括天线各项参数的显示和图像绘制,状态的显示使用线程处理,通过创建线程、调用线程、线程使用临界区对字符串的非冲突访问。字符串处理包括使用find()函数和ReverseFind()等CString接口函数查找截取协议字并使用对话框句柄,调用SetDlgItemText()函数来显示到设计好的各个静态文本控件。本软件规定,每当接收开头A、g等开头的协议字,在接收完之后,如果出现两个相同的字母,则会在前一个接收到的协议字处理完之后,清空m_ReceiveBuf和m_ReceiveBuf_Copy变量,并且保存当前最后一个字符。清空是因为方位俯仰AGC等数据每隔0.1 s就会回送,及时地重置累加变量不仅节约内存,而且PC能够在字符串处理上加快速度,不易出错[8]。

字符串对协议字“g****”的处理完成状态回显的代码如下所示:

在主对话框中的主线程加入:

//发现两个‘g’,变量重置为‘g’

if((m_ReceiveBuf.Find(_T("g"),1))!=-1)

{

m_ReceiveBuf=_T("g");

m_ReceiveBuf_Copy=_T("g");

}

在主对话框的子线程处理函数中加入:

if((gpos=strTemp.ReverseFind('g'))>=0)

{

//满足协议字“g****”5个字符要求

if((strTemp.GetLength()-gpos-1)>=4)

{

CString preprocess=strTemp.Mid(gpos +1,4),postprocess=_T("");//截取后4位

postprocess.Format("%1.3fV",atof(preprocess)/1000);SetDlgItemText(m_hTestingDlg,IDC_NAGC,postprocess);//显示到相关控件上

}

}

图像绘制的简略代码如下:

//消息响应函数中(主对话框中的主线程)加入

if(((Apos=m_ReceiveBuf.Find('g'))>=0) &&(m_ReceiveBuf.GetLength()-Apos-1==4))

{

Draw1AgcPic();//完成AGC背景图包括坐标系点阵图的绘制和坐标点的标识

Draw1AgcDots();//使用数组存储的点动态绘制AGC图像

}

鉴于移动窗口到桌面以外,会导致绘图控件上的图像重绘残缺。为了解决上述问题,需要在OnPaint()函数中加入绘图控制代码,保证图像在误操作时能够重绘显示[9]。

4 采集的数据存储的软件实现

实时采集数据的保存可以保存在TXT文件下,但TXT文件阅览大量的串口数据不直观,所以采用数据库存储的方式,系统采用常用的Access来建立表存储[10]。

微软Access数据库采用文件存储数据库内容,数据库管理软件不需要搭建外部数据库服务器。Access数据库属于关系型数据库,支持标准的SQL操作。该软件使用ADO方式连接Access数据库,采集软件对数据库进行添加记录、修改记录操作。

Access数据库文件名为Testing.mdb,该数据库由一个表组成。测试数据保存在“串口关键数据”表中。由于串口发送数据过于频繁(天线发送数据发送频率为0.1 s,每次发送全部状态的协议字),数据量大,全部点存储有实用性小和浪费资源的缺点,可以类似信号采样,定时取数并存储,例如每隔0.5 s或者1 s,由于状态显示全部在界面控件上,可以采用定时读取协议字相关控件内容的方法来取代字符串处理,通过调用SetTimer()函数发送WM_TIMER消息来定时触发[11]。代码实现如下所示。

//WM_TIMER消息处理函数

void CTestingDlg::OnTimer(UINT_PTR nIDEvent){

if(nIDEvent==1)

{

CString temp;

try

{

dataADO.IniDatabase();//初始化数据库连接

recADO=dataADO.getRecordset("select * from 串口关键数据记录");//选择表

recADO->AddNew();//添加新记录

GetDlgItemText(IDC_NAGC,temp);//读取已经写入控件的AGC值

recADO->PutCollect("AGC",_variant_t(temp));//将AGC值加入Access数据库

...(其他数据比如天线姿态、GPS数据等做上述类似的处理)

recADO->MoveNext();//移到下一个记录

recADO->Update();//更新

recADO->Close();//关闭表

dataADO.cloDatabase();//关闭连接

}

catch(_com_error e){...}//异常处理

}

}

实时采集到的图像的保存可以使用兼容DC、兼容位图和绑定解绑图像来完成,实现代码为:

CWnd*pWnd=GetDlgItem(IDC_ PICTURE2);

CDC* pDC=pWnd->GetDC();

//获得图像控件大小

CRect testrect;

pWnd->GetWindowRect testrect);/

ScreenToClient(testrect);

//创建兼容DC

CDC testDC;

testDC.CreateCompatibleDC(pDC);

//创建兼容位图

CBitmap testbmp;

testbmp.CreateCompatibleBitmap(pDC, testrect.Width(),testrect.Height());

//将兼容位图选入兼容DC

CBitmap*pOld=testDC.SelectObject

(&testbmp);

testDC.BitBlt(0,0,testrect.Width(),testrect.Height(),pDC,0,0,SRCCOPY);//将当前DC内容复制到兼容DC

CImage image;

image.Attach((HBITMAP)(testbmp.m_hObject));//绑定图像

image.Save(Save.GetPathName());//保存操作

image.Detach();//解除绑定

此方法唯一的缺点是需要手动来保存图像,如果想每隔一段时间保存图像可以在主对话框中设置定时器,可以在前面的绘图程序中也调用SetTimer()函数发送WM_TIMER消息来调用消息响应函数OnTimer()定时触发图像保存命令来自动保存图像,由于系统一般能快速对星且持续稳定,自动保存图像意义不大,所以软件没有采用此方法[12]。

5 采集结果分析

将软件应用到实际的船载卫星通信系统中,通过选取中星6号卫星,利用夏普接收机,对星后卫星实时状态与摇摆台所在地区GPS信息如图3所示。

图3 船载卫星天线实时状态界面

在选星参数发送给天线串口后,对星时接收机传送过来的AGC值图像绘制以及天线实时姿态如图4和图5所示。

从实际天线各项参数和软件采集到的数据对比分析,天线姿态差别在5°以内,在图像采集中间部分的时刻已经对上卫星,且吻合频谱分析仪采集到的信号波形信息,软件达到工程应用的要求[13]。

6 结束语

文中探讨了利用MFC实现在船载卫星通信系统中的串口通信,通过串口发送过来的数据流利用成熟 的串口类实时采集,并将状态数据通过多线程实时显

图4 船载卫星天线实时AGC曲线

图5 船载卫星天线绝对方位角、俯仰角和 相对船头的方位角曲线

示在界面,绘制了动态AGC、天线姿态状态图,并且能够通过操作数据库完成串口数据利用控件回显定时保 存和图像保存,测试结果表明该软件运行稳定,效果 明显[14]。

[1] 卢万铮.天线理论与技术[M].西安:西安电子科技大学出版社,2004.

[2] 谭思亮,邹超群.Visual C++串口通信工程开发实例导航[M].北京:人民邮电出版社,2003.

[3] 丁华众.船用卫星通信终端的研究与应用[D].南京:南京邮电大学,2007.

[4] 孙 鑫.VC++深入详解[M].北京:电子工业出版社,2006.

[5] Matzger R C.软件调试思想:采用多学科方法[M].尹晓峰,马振萍,译.北京:电子工业出版社,2004.

[6] Kraus J D,Marhefka R J.Antennas:for all applications[M].New York:New McGraw-Hill,2001.

[7] INTELSAT SSOG 210.Earthstation verification tests[S].2000.

[8] 明日科技,刘锐宁,梁 水,等.Visual C++开发技术大全[M].北京:人民邮电出版社,2009.

[9] 李长林,高 洁.Visual C++串口通信技术与典型实例[M].北京:清华大学出版社,2006.

[10] 李春葆,曾 平.Access数据库原理与应用[M].北京:清华大学出版社,2005.

[11] 候俊杰.深入浅出MFC[M].武汉:华中科技大学出版社,2001.

[12] Agilent Technologies.User’s/programmer’s reference[M].USA:Agilent,2006.

[13] 刘付强.船用卫星天线微型姿态测量系统关键技术研究[D].长沙:国防科学技术大学,2008.

[14] Bridge W M.Cross Coupling in a five horn monopulse tracking system[J].IEEE Transactions on Antennas AKD Propaqation,1972,AP-20(4):437-442.

Design and Implementation of Serial Data Acquisition System for Ship Antenna

ZHANG Hai-yang

(College of Telecommunications and Information Engineering,Nanjing University of Posts and Telecommunications,Nanjing 210000,China)

In the ship carrier satellite communication system,the antenna control system is connected to the PC via serial port,the PC controls antenna on satellite,the data is sent to PC monitor and control software interface again to control,acquire and process data storage,realizing the observation and adjustment for antenna on satellite and antenna attitude to quickly and accurately to the star.Taking the design of graphical interface as a starting point,expound multi thread human-computer interface implemented by using C++ language and MFC to design PC end using USB port antenna serial data acquisition,and use GDI drawing functions in the PC interface to achieve a true representation of the accurate synchronization of the key parameters time variation diagrams.The key parameters includes Automatic Gain Control (AGC),antenna attitude and so on,and uses the Access database to save data records,to prepare for the query and evaluating.The results show that the software is consistent with the actual standard and can run stably,and can reflect the real-time status data and motion picture of antenna,ship and satellite.At present,it has been widely used in the monitoring and testing of the satellite communication system,and the good interface interaction environment is obtained.

MFC;ship borne satellite communication system;AGC;antenna attitude;serial communication;multithreading;critical area;database;image storage

2015-03-12

2015-06-16

时间:2015-11-15

国家自然科学基金资助项目(61271234)

张海洋(1990-),男,硕士研究生,研究方向为卫星通信技术。

http://www.cnki.net/kcms/detail/61.1450.TP.20151119.1107.016.html

TP302

A

1673-629X(2016)01-0150-05

10.3969/j.issn.1673-629X.2016.01.032

猜你喜欢
控件线程对话框
实时操作系统mbedOS 互斥量调度机制剖析
基于.net的用户定义验证控件的应用分析
正常恢复虚拟机
基于国产化环境的线程池模型研究与实现
Bootlace Worms’Secret etc.
What Is Beauty?
关于.net控件数组的探讨
浅谈VB的通用对话框《CommonDialog》控件的使用
计算机中的多线程问题
基于嵌入式MINIGUI控件子类化技术的深入研究与应用