基于VC++的AIS接收系统的设计含源文件.docx
《基于VC++的AIS接收系统的设计含源文件.docx》由会员分享,可在线阅读,更多相关《基于VC++的AIS接收系统的设计含源文件.docx(40页珍藏版)》请在冰点文库上搜索。
![基于VC++的AIS接收系统的设计含源文件.docx](https://file1.bingdoc.com/fileroot1/2023-5/1/36f815bc-3ccf-430a-923c-22adce88641d/36f815bc-3ccf-430a-923c-22adce88641d1.gif)
基于VC++的AIS接收系统的设计含源文件
基于VC++的AIS接收系统的设计
[摘要]随着信息化和信息技术的普及和推广,通信显得尤为重要。
。
船舶自动识别系统(AIS)是海事管理中的海上通信的最主要工具。
船舶自动识别系统(AutomaticIdentificationSystem,简称AIS)是近年来几个国际组织,特别是国际海事组织(IMO)、国际航标协会(IALA)、国际电信联盟(ITU-R)共同的研究成果。
船舶自动识别系统是一种新型的助航系统,是在高精度卫星定位技术和甚高频无线数传技术发展的基础上产生的,实现了传统的经验航海向数字航海的跨越。
本文主要研究AIS报文信息的种类、结构、内涵;以及数据的串口实时不间断的接收;对数据进行CRC校验;对数据进行拆分、格式验证;抽取封装数据,转换成六位二进制字符的二进制串;最后根据电文的格式进行解码、显示、保存至数据库。
本课题的研究对于其应用于ECDIS显示系统,航标系统和船舶报告系统等有重要的意义。
[关键词]AIS海上通信AIS接收AIS解码串口
VC++basedontheAISreceiversystemdesign
[Abstract]Withtheinformationtechnologyandinformationtechnology,thepopularityandpromotion,communicationisparticularlyimportant..AutomaticIdentificationSystem(AIS)isthemaritimeadministrationofthemostimportanttoolformaritimecommunications.AutomaticIdentificationSystem(AutomaticIdentificationSystem,referredtoasAIS)inrecentyears,severalinternationalorganizations,inparticulartheInternationalMaritimeOrganization(IMO),InternationalAssociationofLighthouse(IALA),InternationalTelecommunicationUnion(ITU-R)jointresearchresults.AutomaticIdentificationSystemisanewtypeofaidstonavigationsysteminthehigh-precisionsatellitepositioningtechnologyandveryhighfrequencywirelessdatatransmissiontechnologytoproducethebasisforthedevelopmentandrealizationofthetraditionalexperienceofsailingacrosstodigitalnavigation.ThispaperstudiesinformationAISmessagetypes,structure,andconnotations;anduninterruptedreal-timeserialdatareceiver;CRCchecksumonthedata;thedatasplit,formatverification;encapsulateddatacollected,convertedintosixbinarystringofbinarycharacters;Finally,inaccordancewiththeformatofamessagetodecode,display,savetothedatabase.ResearchonthesubjectappliedforECDISdisplaysystems,navigationsystemsandshipreportingsystemhasanimportantsignificance.
[Keywords]MaritimecommunicationsAISInformationreceived
DecodingofAISserialport
第一章引言
1.1论文研究背景与意义
背景:
随着信息化和信息技术的普及和推广,通信显得尤为重要。
船舶自动识别系统(AIS)是海事管理中的海上通信的最主要工具。
船舶自动识别系统(AutomaticIdentificationSystem,简称AIS)是近年来几个国际组织,特别是国际海事组织(IMO)、国际航标协会(IALA)、国际电信联盟(ITU-R)共同的研究成果。
船舶自动识别系统是一种新型的助航系统,是在高精度卫星定位技术和甚高频无线数传技术发展的基础上产生的,是传统的经验航海向数字航海跨越的里程碑。
原本这项技术的设计是为了帮助船舶避碰,但是将这些信息还有其他方面的重要应用,如将AIS信息用于自动避碰的研究,还可将船舶的动态信息以图形化的方式显示出来,可实现船舶的监控和跟踪,给船舶管理,进行交通密度估计,交通流分析,通航环境评价等研究。
意义:
AIS系统的出现标志着海上监视技术取得革命性的进步,标志着船舶间和
船岸间的信息交换进入了计算机数字通信的时代。
AIS系统有助于加强海上生命安全,
提高航行的安全性和效率,有利于主管机关或港口对船舶的直接监控,有利于海洋环境的保护。
研究AIS信息的接收和解码对于其应用于ECDIS显示系统,航标系统和船舶报告系统等有重要的意义。
1.2本课题研究内容与目标
研究内容:
本系统研究的从AIS接收机的数据通过串口传送到计算机上,并对接收的数据进行校验,转换成规定的格式,进行解码,显示在客户区上。
当然前提首先要知道AIS数据的一些基本知识,以及CRC校验的相关知识,还有一些串口通信技术,这些将在第二章详细介绍。
目标:
使用VC++6.0、SQLSERVER2000实现系统,本系统虽然是模拟接收,最终是想真正的将航海学院的AIS接收机数据接收到计算机上,为AIS具体研究提供方便。
第二章开发环境及相关技术的介绍
2.1C++语言的介绍
C++语言是一种优秀的面向对象程序设计语言,它在C语言的基础上发展而来,但它比C语言更容易为人们学习和掌握。
C++以其独特的语言机制在计算机科学的各个领域中得到了广泛的应用。
面向对象的设计思想是在原来结构化程序设计方法基础上的一个质的飞跃,C++完美地体现了面向对象的各种特性。
C++,这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“Cplusplus”,它是一种使用非常广泛的计算机编程语言。
C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。
它支持过程序程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。
贝尔实验室的本贾尼·斯特劳斯特卢普(w:
en:
BjarneStroustrup)博士在20世纪80年代发明并实现了C++(最初这种语言被称作“CwithClasses”)。
一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。
虚函数(virtualfunction)、运算符重载(operatoroverloading)、多重继承(multipleinheritance)、模板(template)、异常(exception)、RTTI、名字空间(namespace)逐渐被加入标准。
1998年国际标准组织(ISO)颁布了C++程序设计语言的国际标准ISO/IEC14882-1998。
遗憾的是,由于C++语言过于复杂,以及他经历了长年的演变,直到现在(2004年)只有少数几个编译器完全符合这个标准(这么说也是不完全正确的,事实上,至今为止没有任何一款编译器完全支持ISOC++)。
另外,就目前学习C++而言,可以认为他是一门独立的语言;他并不依赖C语言,我们可以完全不学C语言,而直接学习C++。
根据《C++编程思想》(ThinkinginC++)一书所评述的,C++与C的效率往往相差在正负5%之间。
所以有人认为在大多数场合C++完全可以取代C语言(然而我们在单片机等需要谨慎利用空间、直接操作硬件的地方还是要使用C语言)。
根据EffectiveC++第三版第一条款的描述,现在C++由以下四个“子语言”组成:
(1)C子语言。
C++支持C语言的几乎全部功能,在语法上与C语言仅有极微妙的差别(如括号表达式的左右值性,具体请参考C++标准文献)。
(2)面向对象的C++。
C++首先作为一门面向对象的语言而闻名,这个特点在这里不再详述。
(3)泛型编程语言。
C++强大(但容易失控的)模板功能使它能在编译期完成许多工作,从而大大提高运行期效率。
(4)STL(C++标准模板库)。
随着STL的不断发展,它已经逐渐成为C++程序设计中不可或缺的部分,其效率可能比一般的naive代码低些,但是其安全性与规范性使它大受欢迎。
C++语言发展大概可以分为三个阶段:
第一阶段从80年代到1995年。
这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。
当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。
2.2串口及串口通信
串口是常用的计算机与外部串行设备之间的数据传输通道,串行通信技术是基于串行通信接口标准的数据通信技术。
实现串行通信的方法有多种,其中常见的主要有两种:
调用API函数编写通信程序和利用MSComm控件实现串行通信。
随着面向对象编程技术的发展,利用开发环境本身已有的控件进行开发设计,不仅可以减少开发时间,节约开发投资,而且有利于保证系统的稳定性和可靠性,常用的针对串口通信的控件有MSComm、SPComm、CommPortDrv、APRO和TGPS等,其中MSComm控件具有较强的通用性,在VisualBasic、VisualC++和Delphi等开发环境中均可使用。
2.3MSComm控件详解
MSCComm(MiscrosofCommunicationControl)通信控件是微软基于组件对象模型(COM)开发的一个事件驱动的全双工高级通信接口,作为主要用于串行通信编程的Active控件,其具有非常好的运行效率和稳定性。
MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。
MicrosoftCommunicationsControl(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:
一是事件驱动(Event-driven)方法,一是查询法。
(1)MSComm控件两种处理通讯的方式
MSComm控件提供下列两种处理通讯的方式:
事件驱动方式和查询方式。
(1.1)事件驱动方式
事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者CarrierDetect(CD)或RequestToSend(RTS)线上一个字符到达或一个变化发生时。
在这些情况下,可以利用MSComm控件的OnComm事件捕获并处理这些通讯事件。
OnComm事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅CommEvent属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSComm控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个MSComm控件。
(1.2)查询方式
查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
(2)MSComm控件的常用属性
MSComm控件有很多重要的属性,但首先必须熟悉几个属性。
CommPort设置并返回通讯端口号。
Settings以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen设置并返回通讯端口的状态。
也可以打开和关闭端口。
Input从接收缓冲区返回和删除字符。
Output向传输缓冲区写一个字符串。
下面是常用属性描述:
CommPort属性设置并返回通讯端口号。
语法object.CommPort[value](value一整型值,说明端口号。
)说明在设计时,value可以设置成从1到16的任何数(缺省值为1)。
但是如果用PortOpen属性打开一个并不存在的端口时,MSComm控件会产生错误68(设备无效)。
注意:
必须在打开端口之前设置CommPort属性。
RThreshold属性:
在MSComm控件设置CommEvent属性为comEvReceive并产生OnComm之前,设置并返回的要接收的字符数。
语法object.Rthreshold[=value](value整型表达式,说明在产生OnComm事件之前要接收的字符数。
)说明当接收字符后,若Rthreshold属性设置为0(缺省值)则不产生OnComm事件。
例如,设置Rthreshold为1,接收缓冲区收到每一个字符都会使MSComm控件产生OnComm事件。
CTSHolding属性:
确定是否可通过查询ClearToSend(CTS)线的状态发送数据。
ClearToSend是调制解调器发送到相联计算机的信号,指示传输可以进行。
该属性在设计时无效,在运行时为只读。
语法:
object.CTSHolding(Boolean)Mscomm控件的CTSHolding属性设置值:
TrueClearToSend线为高电平,FalseClearToSend线为低电平。
说明:
如果ClearToSend线为低电平(CTSHolding=False)并且超时时,MSComm控件设置CommEvent属性为comEventCTSTO(ClearToSendTimeout)并产生OnComm事件。
ClearToSend线用于RTS/CTS(RequestToSend/ClearToSend)硬件握手。
如果需要确定ClearToSend线的状态,CTSHolding属性给出一种手工查询的方法。
详细信息有关握手协议,请参阅Handshaking属性。
SThreshold属性:
MSComm控件设置CommEvent属性为comEvSend并产生OnComm事件之前,设置并返回传输缓冲区中允许的最小字符数。
语法object.SThreshold[=value]value整形表达式,代表在OnComm事件产生之前在传输缓冲区中的最小字符数。
说明:
若设置Sthreshold属性为0(缺省值),数据传输事件不会产生OnComm事件。
若设置Sthreshold属性为1,当传输缓冲区完全空时,MSComm控件产生OnComm事件。
如果在传输缓冲区中的字符数小于value,CommEvent属性设置为comEvSend,并产生OnComm事件。
comEvSend事件仅当字符数与Sthreshold交叉时被激活一次。
例如,如果Sthreshold等于5,仅当在输出队列中字符数从5降到4时,comEvSend才发生。
如果在输出队列中从没有比Sthreshold多的字符,comEvSend事件将绝不会发生。
Handshake常数
常数值描述
comNone0无握手。
comXonXoff1XOn/Xoff握手。
comRTS2Request-to-send/clear-to-send握手。
comRTSXOnXOff3Request-to-send和clear-to-send握手皆可。
OnComm常数
常数值描述
comEvSend1发送事件。
comEvReceive2接收事件。
comEvCTS3clear-to-send线变化。
comEvDSR4data-setready线变化。
comEvCD5carrierdetect线变化。
comEvRing6振铃检测。
comEvEOF7文件结束。
Error常数
常数值描述
comEventBreak1001接收到中断信号
comEventCTSTO1002Clear-to-send超时
comEventDSRTO1003Data-setready超时
comEventFrame1004帧错误
comEventOverrun1006端口超速
comEventCDTO1007Carrierdetect超时
comEventRxOver1008接收缓冲区溢出
comEventRxParity1009Parity错误
comEventTxFull1010传输缓冲区满
comEventDCB1011检索端口设备控制块(DCB)时的意外错误
InputMode常数
常数值描述
comInputModeText0(缺省)通过Input属性以文本方式取回数据。
comInputModeBinary1通过Input属性以二进制方式检取回数据。
CDHolding属性:
通过查询CarrierDetect(CD)线的状态确定当前是否有传输。
CarrierDetect是从调制解调器发送到相联计算机的一个信号,指示调制解调器正在联机。
该属性在设计时无效,在运行时为只读。
语法object.CDHolding设置值:
CDHolding属性的设置值为:
设置描述TrueCarrierDetect线为高电平,FalseCarrierDetect线为低电平。
说明:
注意当CarrierDetect线为高电平(CDHolding=True)且超时时,MSComm控件设置CommEvent属性为comEventCDTO(CarrierDetect超时错误),并产生OnComm事件。
注意在主机应用程序中捕获一个丢失的传输是特别重要的,例如一个公告板,因为呼叫者可以随时挂起(放弃传输)。
CarrierDetect也被称为ReceiveLineSignalDetect(RLSD)。
数据类型Boolean
DSRHolding属性:
确定DataSetReady(DSR)线的状态。
DataSetReady信号由调制解调器发送到相连计算机,指示作好操作准备。
该属性在设计时无效,在运行时为只读。
语法:
object.DSRHoldingobject所在处表示对象表达式,其值是“应用于”列表中的对象。
DSRHolding属性返回以下值:
值描述:
TrueDataSetReady线高,FalseDataSetReady线低。
说明:
当DataSetReady线为高电平(DSRHolding=True)且超时时,MSComm控件设置CommEvent属性为comEventDSRTO(数据准备超时)并产生OnComm事件。
当为DataTerminalEquipment(DTE)机器写DataSetReady/DataTerminalReady握手例程时该属性是十分有用的。
数据类型:
Boolean
Settings属性:
设置并返回波特率、奇偶校验、数据位、停止位参数。
语法:
object.Settings[=value]说明:
当端口打开时,如果value非法,则MSComm控件产生错误380(非法属性值)。
Value由四个设置值组成,有如下的格式:
"BBBB,P,D,S",BBBB为波特率,P为奇偶校验,D为数据位数,S为停止位数。
value的缺省值是:
"9600,N,8,1"。
InputLen属性:
设置并返回Input属性从接收缓冲区读取的字符数。
语法object.InputLen[=value]InputLen属性语法包括下列部分:
value整型表达式,说明Input属性从接收缓冲区中读取的字符数。
说明:
InputLen属性的缺省值是0。
设置InputLen为0时,使用Input将使MSComm控件读取接收缓冲区中全部。
2.4AIS数据基本知识
AIS数据包格式
AIS采用面向比特的协议,该协议以ISO/IEC3309,1993数据包结构定义规定的高级数据链路控制(HDLC)为基础.AIS发送包传输数据的总体结构如图2.4.1所示。
_
图2.4.1 AIS发送数据包总体结构
各部分的编码要求分述如下.
(1.1)训练序列训练序列是由交替的0和1(010101..)组成的比特波形,图2.4.2(a)所示。
图2.4.2寻列序列和NRZI处理
在开始标记之前,应先发射24比特的序文.由于通信模块要采用不归零倒置(NRZI)模式组合(也就是差分码),所以物理层数据的比特波形可如图2.4.2(b)所示。
后面数据包中的其它部分的数据,在经过通信之后,都要经过类似的NRZI处理。
开始标记开始标记的长度应为8比特,由标准的HDLC标记组成,其作用为标