版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于VC++的AIS接收系统的设计[摘要]随着信息化和信息技术的普及和推广,通信显得尤为重要。。船舶自动识别系统(AIS)是海事管理中的海上通信的最主要工具。船舶自动识别系统(AutomaticIdentificationSystem,简称AIS)是近年来几个国际组织,特别是国际海事组织(IMO)、国际航标协会(IALA)、国际电信联盟(ITU-R)共同的研究成果。船舶自动识别系统是一种新型的助航系统,是在高精度卫星定位技术和甚高频无线数传技术发展的基础上产生的,实现了传统的经验航海向数字航海的跨越。本文主要研究AIS报文信息的种类、结构、内涵;以及数据的串口实时不间断的接收;对数据进行CRC校验;对数据进行拆分、格式验证;抽取封装数据,转换成六位二进制字符的二进制串;最后根据电文的格式进行解码、显示、保存至数据库。本课题的研究对于其应用于ECDIS显示系统,航标系统和船舶报告系统等有重要的意义。[关键词]AIS海上通信AIS接收AIS解码串口VC++basedontheAISreceiversystemdesign[Abstract]Withtheinformationtechnologyanrmationtechnology,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目录TOC\o"1-4"\u第一章引言ﻩPAGEREF_Toc232569769\h11.1ﻩ论文研究背景与意义ﻩPAGEREF_Toc232569770\h11.2本课题研究内容与目标ﻩPAGEREF_Toc232569771\h1第二章开发环境及相关技术的介绍 PAGEREF_Toc232569772\h22.1C++语言的介绍 PAGEREF_Toc232569773\h22.2串口及串口通信 PAGEREF_Toc232569774\h32.3MSComm控件详解ﻩPAGEREF_Toc232569775\h42.4AIS数据基本知识ﻩPAGEREF_Toc232569776\h82.5AIS数据的CRC校验相关知识ﻩPAGEREF_Toc232569777\h122.6关于VisualC++6.0工具的介绍ﻩPAGEREF_Toc232569778\h152.7MicrosoftSQLServer介绍ﻩPAGEREF_Toc232569779\h152.8开发环境的搭建ﻩPAGEREF_Toc232569780\h16第三章需求分析 PAGEREF_Toc232569781\h173.1数据结构分析 PAGEREF_Toc232569782\h173.2功能的分析ﻩPAGEREF_Toc232569783\h173.3功能具体分析 PAGEREF_Toc232569784\h19第四章概要设计ﻩPAGEREF_Toc232569785\h214.1系统框架设计ﻩPAGEREF_Toc232569786\h214.2主要类的类图 PAGEREF_Toc232569787\h224.3对象-行为模型ﻩPAGEREF_Toc232569788\h234.4系统状态变迁图ﻩPAGEREF_Toc232569789\h24第五章详细设计ﻩPAGEREF_Toc232569790\h255.1数据结构设计ﻩPAGEREF_Toc232569791\h255.1.1数据关系模型 PAGEREF_Toc232569792\h255.1.2实体-关系模型ﻩPAGEREF_Toc232569793\h255.1.3数据字典ﻩPAGEREF_Toc232569794\h265.2系统体系结构设计 PAGEREF_Toc232569795\h275.2.1发送端数据的串口发送设计ﻩPAGEREF_Toc232569796\h275.2.2接收端的体系结构设计 797\h285.2.3.1发送端使用WindowsAPI实现串口数据的接收。ﻩPAGEREF_Toc232569798\h285.2.3.2数据接收的数据处理,调用AISTool类中的函数ﻩPAGEREF_Toc232569799\h305.3用户界面设计 PAGEREF_Toc232569800\h345.4系统出错处理设计 PAGEREF_Toc232569801\h355.4.1出错信息ﻩPAGEREF_Toc232569802\h355.4.2补救措施ﻩPAGEREF_Toc232569803\h36结论 PAGEREF_Toc232569804\h37致谢语 PAGEREF_Toc232569805\h38参考文献ﻩPAGEREF_Toc232569806\h39附录 PAGEREF_Toc232569807\h40第一章引言论文研究背景与意义背景:随着信息化和信息技术的普及和推广,通信显得尤为重要。船舶自动识别系统(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++,这个词在中国大陆的HYPERLINK"http://baike.baidu.com/view/39175.htm"\t"_blank"程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“Cplusplus”,它是一种使用非常广泛的计算机编程语言。C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持过程序程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。
HYPERLINK"http://baike.bai/view/37115.htm"\t"_blank"贝尔实验室的本贾尼·斯特劳斯特卢普(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语言,我们可以完全不学HYPERLINK"http://baike.baid/view/1219.htm"\t"_blank"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各部分的编码要求分述如下.(1.1)训练序列训练序列是由交替的0和1(010101..)组成的比特波形,图2.4.2(a)所示。图2.4.2寻列序列和NRZI处理在开始标记之前,应先发射24比特的序文.由于通信模块要采用不归零倒置(NRZI)模式组合(也就是差分码),所以物理层数据的比特波形可如图2.4.2(b)所示后面数据包中的其它部分的数据,在经过通信之后,都要经过类似的NRZI处理。ﻩ开始标记开始标记的长度应为8比特,由标准的HDLC标记组成,其作用为标识 数据包的开端.HDLC标记由8bit长的比特波形组成:01111110(7Eh).该标记尽ﻩ管包含6个连续(1),但不需要进行位填充(1.2)数据段在一个标准数据包中数据部分长度应为168比特.但是在AIS中也存在长度少于5个时隙的非标准数据包。(1.3)帧校验序列(FCS)在AIS中,FCS根据[ISO/IEC3309:1993]的规定,采用循环冗余校验(CRC)16bit多项式来计算和校验.在CRC计算开始时应将CRC码元预设为1。CRC计算中应该只包含包括位填充的数据部分。(1.4).结束标志结束标志与起始标志完全相同。(1.5)缓冲缓冲部分通常为24bit长,包括以下四部分内容:位填充4比特(除安全相关电文和二进制电文以外的所有信息)距离延迟12比特转发器延迟2比特同步晃动6比特这种缓冲码一般是为了应对实际应用中的各种可能情况对电文长度或者其它对接收方接收数据所产生的影响,比如位填充,就是为了应对位填充所引起的电文长度的增加(根据统计分析表明,有76%的组合最多需要3bit位填充).其它缓冲类似。(1.6).比特填充以上所述各部分字段中,数据部分和FCS比特流应受位填充控制.也就是说一旦发现输出位流中连续出现5个以上(1)时,应在该5个(1)后插入1个0.这种方法适用于除HDLC标记(开始标记与结束标记)以外的所有比特。(1.7)HDLC反转AIS规定,所有数据部分的内容都应该按照ISO/IEC3009:1993的规定:从VHF数据链发出的数据应是8bit的字节,在电文表中从上至下排列.各个字节在输出时应该是最低有效位最先发送,并且为了保持字节边界,最后一个字节中的无用比特应当置为零。(2.1)消息类型说明AIS中共规定了22种消息类型,其中常用的报文类型如表2.4.3表2.4.3常用报文类型列表 ﻩﻩﻩ图2.4.4消息ID码在信息中的位置其中消息ID码(6bit)被包含在消息数据包中,如图2.4.4所示,用以区别消息类型,接收站按照消息ID码分析消息中各个数据的意义.具体的消息编码格式,依据消息ID码的不同而有所不同.下面以AIS网络中最常见的消息ID为1,2,3的船位报告为例,各个字段的详细分布如表2.4.5所示。ﻩﻩﻩﻩ ﻩ表2.4.5电文1、2、3比特分配(2.2)AIS报文格式说明下面以为!AIVDM,×,×,×,A,IS-S,×*hh<CR><LF>例,说明其中,!ﻩ表示开始AIVDM表示电文报头×,×,×分别表示发送这一信息需要的句子总数(1-9)、本句的句子序数(1-9)和连续信息的识别(0-9)A表示AIS信道号;I表示信息的ID码S-S表示打包的ITU-RM.1371无线电信息×表示填充的BIT数(0-5)* 表示结束hh表示校验字节(2.3)AIS字符的编码AIS的字符编码采用的是6比特二进制串,因为AIS数据的字符有限,并不像ASCII字符那么丰富。为了保证数据传输的速度,AIS采用了6比特编码,取代了8比特的ASCII表2.4.6A2.5AIS数据的CRC校验相关知识(1)CRC校验原理CRC的校验原理CRC校验采用多项式编码方法。被处理的码组可以看作码组中各码元当作多项式的系数。例如1100101表示为1·x6+1·x5+0·x4+0·x3+1·x2+0·x+1,即x6+x5+x2+1。设编码前的原始信息多项式为P(x),P(x)的最高幂次加1等于k;生成多项式为G(x),G(x)的最高幂次等于r;CRC多项式为R(x);编码后的带CRC的信息多项式为T(x)。采用CRC校验时,发送方和接收方用同一个生成多项式G(x),并且G(x)的首位和最后一位的系数必须为1。发送方编码方法:将P(x)乘以xr(即对应的二进制码序列左移r位),再除以G(x),所得余式即为R(x)。用公式表示为T(x)=xrP(x)+R(x)接收方解码方法:将T(x)除以G(x),如果余数为0,则说明传输中无错误发生,否则说明传输有误。以下举例简单给予说明,设信息码为1100,生成多项式为1011,即P(x)=x3+x2,G(x)=x3+x+1,计算CRC的过程如下:是一个n阶的二进制多项式即R(x)=x。注意到G(x)最高幂次r=3,得出CRC为010。因此,T(x)=(x6+x5)+(x)=x6+x5+x,即1100000+010=1100010。T(x)如果传输无误,则G(x)=x6+x5+xx3+x+1=x3+x2+x,无余式。CRC校验可以100%地检测出所有奇数个随机错误和长度小于等于k(k为过G(x)的阶数)的突发错误。所以CRC的生成多项式的阶数越高,那么误判的概率就越小。(2)AIS信息封装结构AIS的信息封装结构根据AIS性能标准,AIS中的信息是通过数据包传输的,每帧为1分钟,一帧中含有2250个时隙,每个时隙的时间长度为26.7ms。AIS的数据分组格式如图2.5.1所示。 ﻩﻩ ﻩ图2.5.1AIS数据分组格式数据分组应该自左向右,预设的分组总长度为256比特,除训练序列以外,这一结构应该同普通的HDLC(高级数据链路控制)结构完全一样。采用训练序列是为了对VHF接收机进行同步调整。训练序列为交替的0、1组成的位组合(0101010101…)。在发出标记之前,应先发射24比特的前置码,但由于通信电路采用NRZI模式,这一组合应加以修正。开始标记的长度应为8比特,由一个标识HDLC标记组成,其作用为检测传输分组的开端。HDLC标记有一个位组合组成,长度为8比特:01111110(7EH)。该标记尽管包含6个连续位,但不受位填充影响。在预设传输分组中,数据部分长度应为168比特。由于HDLC是一个在同步网上传输数据、面向位的数据链路层协议,并且传输的数据以二进制数据组成,不存在任何特殊的控制代码,但帧中的信息包含了控制和响应命令。帧校验序列(FCS)采用循环冗余校验16比特多项式来计算[ISO/IEC3309∶1993]中所定义的校验和,CRC计算中应包括位填充的数据部分。结束标志和开始标志的描述一致。缓冲码的长度为24比特,其用途如表2.5.2表2.(3)AIS的信息信息帧校验序列(FCS)计算原理根据AISITU-RM.1371的性能标准,系统中共有22种信息用于传输不同的消息。无论哪一种信息,其编码、解码时都需要进行CRC校验。下面将以AIS的输出信息为例来介绍CRC校验,无论属于AIS的22种信息中的哪种信息,其数据部分中都是二进制数据,而AIS的输入输出信息都是采用ASCII码,因此系统在消息的封装与解封装中都存在着ASCII码与二进制码转换的问题,见图2.5.图2.5由图1可以看出,无论是在发出端还是在接收端,要想组成带有CRC编码的帧,或正确解出编码信息,必须完成ASCII码与6位二进制码转换。因为对数据进行循环校验的数据就是HDLC帧中数据部分的6位二进制码组。下面以AIS的输出信息解封装为例解释两种码间的转换。例如:AIS的输出信息为!AIVDM,1,1,,A,1P000Oh1lT1svTP2r;43grwb0Eq4,0*01<CR><LF>其中1P000Oh1lT1svTP2r;43grwb0Eq4为数据部分,*后的01则是用于循环冗余校验的两位16进制校验和。数据部分中的28个字符全为ASCII码,而这28个字符转换成二进制时为28ⅹ8=224比特,这与AIS数据帧中168比特不相符,因此必须将原来的每个ASCII码转换成6比特的二进制数据组。图2. 图2.52.6关于VisualC++6.0工具的介绍VisualC++6是美国微软公司开发的C++集成开发环境,它集源程序的编写、编译、连接、调试、运行,以及应用程序的文件管理于一体,是当前PC机上最流行的C++程序开发环境.作为一个功能非常强大的可视化应用程序开发工具,是计算机界公认的最优秀的应用开发工具之一。2.7MicrosoftSQLServer介绍SQLServer是大型的关系数据库,适合重型企业使用.它建立于Windows的可伸缩性和可管理性之上,提供功能强大的客户/服务器平台,高性能客户/服务器结构的数据库挂历系统可以将VisualBasic,VisualC++作为客户端开发工具,而将SQLServer作为存储数据的后台服务器软件.随着SQLServer产品性能的不断扩大和改善,已经在数据库系统领域占有非常重要的地位。ﻫSQLServer使用Transact----SQL语言来维护,实现和访问数据库,Transact-SQL是SQL的一个子集标准。
SQLServer有多种实现程序润许用户来访问它的服务,用户可以用这些实用程序对SQLServer进行本地管理或远程管理。2.8开发环境的搭建1.安装VC6.0工具2.安装MiscosoftSQLServer20003.创建发送端(SENDPORT)和接收端(RECVPORT)的MFC项目第三章需求分析3.1数据结构分析系统只针对电文1、2、3进行解码,要保证电文信息的每一个子信息都保存 进数据库德相应字段中所以表中字段属性要求有:电文ID、转发次数、用户ID、 航行状 态、回旋速率、实际航速、位置精度、经度、纬度、实际航向、真艏向、 区域使用、备用、RAIM标志、同步状态、时隙时限、UTC时间、时隙增量、时隙ﻩﻩ数、保持标志,有些数据是属于电文1、2所有的,有些事属于电文3所有的,所 以显示时要求根据不同的电文,显示不同的属性。3.2功能的分析ﻩﻩ该系统的功能是通过串口从AIS接收机接收数据到PC机上。为了确保数据在无线通信传输中没有出错,所以要对接收的数据校验包括CRC校验,解封装数据,提取出AIS真实有效数据。AIS中考虑了传输效率,将字符进行了重新编码,编码成6比特表示的字符,所以要进行格式转换,将字符串转换成6比特二进制串。再根据AIS报文格式规定设计具体的算法进行解码,最终显示在客户区并保存进数据库中。ﻩ 这里为了更加清晰的分析功能,列出了功能流程图。图3-1功能流程图3.3功能具体分析(1)数据接收使用串行口COM1接收串行口COM2发送的数据。接收时要求实时持续不间断地完整整句的接收,尽可能符合真实的应用。(2)循环冗余校验:为了保证数据的正确无误的接收,所以AIS采用了CRC校验,确保了传送的正确性。如果校验错误,系统不予接收,并报告错误。如果校验正确,系统才能接收数据。接收之后还要求有一定得验证。系统的校验方法要求是根据数据生成CRC码,与接收的CRC码进行比较。(3)格式验证 为了避免系统接收错误格式的AIS信息,造成接收数据的无效性,并将无效的数据提供显示给客户,误导客户。系统要求必须要对数据格式的验证。比如逗号的个数,部分数据是固定的,部分数据要就一定大小范围的数字。(4)解封装:ﻩﻩ由于接收到得信息并非不用处理就是我们所需要的数据,其外围封装了一层固定的格式,其格式主要是为了实现多种电文,数据长度过长的分段发送,还有数据的完整接收。 以!AIVDM,1,1,,A,1P000Oh1IT1svTP2r:43grwb0Eq4,0*01<CR><LF>为例,解封装后得到得数据就是,1P000Oh1IT1svTP2r:43grwb0Eq4,0(5)格式转换 将解封装后根据AIS对字符的6比特编码进行数据格式转换,要求转换后的数据的显示如下,每个7个字符,每个字符之间有一个空格,分多行显示。000001100000000000000000000000011111110000000001011001100100000001111011111110100100100000000010111010001010000100000011101111111010111111101010000000010101111001000100(6)解码: 按照表2.4.5的比特分配,具体属性采用算法进行解码.要求有些如果解码出来的值是默认值的与非默认值的加以区分 ﻩﻩﻩ ﻩ这里对表2.4.5进行了COPY(7)解码后数据显示ﻩ要求整齐、清晰,界面友好,美观。(8)入数据库 为了以后对数据的查询,要求将数据相关内容含义插入数据库中。数据的结构在数据结构设计中有详细介绍。ﻩﻩﻩ ﻩ ﻩﻩ 图3.3.1数据表结构第四章概要设计4.1系统框架设计该系统分为发送端和接收器端两部分。其中发送端模拟了真实环境渊源不断地数据发送出去,数据格式严格以AIS报文格式为要求,为了测试接收端的CRC校验与格式验证,额外设计个多个测试用例。发送系统采用了定时器实现源源不断的数据发送。接收端采用WindowsAPI的串口编程实现实时地接收数据,使用事件驱动方式,串行口一接收到数据,就响应一接收数据的事件。当一条完整的数据接收完毕之后,而后进行的是对接收数据的验证。为了保证数据在传送中的正确性,AIS采用了CRC校验。为了避免接收错误格式或者是无意义的数据,系统进行了格式验证。验证之后,系统的任务就是对正确数据进行解封装,抽取出AIS真实数据,根据表2.4.6AIS字符编码表进行转换,转换成0、1的二进制串。再根据表2.4.5电文1、2、3比特分配进行解码,最后将解码后的数据显示在应用程序的客户区中,并使用ADO数据访问技术将解码后的数据插入数据库中具体的系统框架如图4.1. ﻩ ﻩ ﻩ 图4.14.2主要类的类图系统中主要进行的是数据的处理,为了让显示和处理分离开,增强系统的可维护性、可拓展性,所以另外定义一个类专门进行数据处理。ﻩﻩ 图4.2.1数据处理的工具类的类图成员属性的描述:AISTool具有的一些属性保存接收的数据,真正AIS有效数据,格ﻩ ﻩﻩ 式转换成6比特二进制串后的数据,以及包括一些AIS解码后具体信ﻩ 息的属性。成员方法描述:CRCCheck是对数据进行CRC校验的方法。ﻩSplitSrcData()是对数据拆分的方法 CheckSplitSrcData()是对数据验证的方法ﻩComposeSubSentence()是将所有分句整合的方法 ﻩ CharConver()是进行格式转换的方法。ﻩ Decode()是数据解码的方法。ﻩﻩ ﻩSaveInDB()插入数据库的方法ﻩﻩﻩFinish()结束重新初始化ﻩ4.3对象-行为模型发送端发送数据,接收端CVIEW类接收数据,接收端CASITool类处理数据,处理后的数据返回给CVIEW类,然后显示。图4.4.4系统状态变迁图当用户启动接收端应用程序时,应用程序启动,并处于等待状态。当数据抵达后,系统处于接收状态。当接收完毕后,系统处于等待状态,可重复接收,或退出应用程序。具体的系统状态变迁图如图4.3所示。图4.第五章详细设计AIS接收系统是从AIS接收机接收数据到PC机上。由于条件不方便,系统采用了串口模拟。所以必须设计有发送端和接收端。发送端从COM1发送,接收端从COM2接收,接收端对数据进行处理,显示,入库。接收端数据处理的时候要考虑到效率的问题。5.1数据结构设计由数据实体的结构图,进一步进行MicrosoftSQLServer数据库系统所支持的实际数据模型的设计,具体描述数据库的逻辑结构。5.1.1数据关系模型该系统并不是关于数据库的系统,所以所涉及的表是很少的,只有一张数据表表名:AIS属性:电文ID、转发次数、用户ID、航行状态、回旋速率、实际航速、位置精度、经度、纬度、实际航向、真艏向、区域使用、备用、RAIM标志、同步状态、时隙时限、UTC时间、时隙增量、时隙数、保持标志5.1.2实体-关系模型系统的实体-关系(Entity-Relationship,ER)模型,就一张表,如图5.2.2所示:图5.2.2E-R模型图5.1.3数据字典系统的数据字典如表所示:表5.1.3名称代码数据类型长度主键外键IDIDintTRUEFALSE电文IDMsgIDIntFALSEFALSE转发次数RepeatIndicatorIntFALSEFALSE用户IDMMSIIntFALSEFALSE航行状态NavigationStatusVarchar100100FALSEFALSE回旋速率ROTVarchar100100FALSEFALSE实际航速SpeedVarchar100100FALSEFALSE位置精度PosAccuracyIntFALSEFALSE经度LongVarchar100100FALSEFALSE纬度LatVarchar100100FALSEFALSE实际航向COGVarchar100100FALSEFALSE真艏向TrueHeadVarchar100100FALSEFALSE区域使用RegionalUseInt
FALSEFALSE备用SpareInt
FALSEFALSERAMI标记RAMIFlagInt
FALSEFALSE同步状态SynStatusIntFALSEFALSE时隙增量TimeLimitIncrementIntFALSEFALSE时隙数TimeLimitNumIntFALSEFALSE保持标志KeepFlagIntFALSEFALSE时隙TimeLimtIntFALSEFALSEUTC时间TimeVarchar100100FALSEFALSE5.2系统体系结构设计5.2.1发送端数据的串口发送设计在发送端系统使用MScomm控件实现数据的串口发送。首先,在VC中添加MSComm控件,然后在对话框中创建MSComm控件然后,打开串口并初始化。代码如下m_Com.SetCommPort(2);//选择COM2 m_Com.SetInBufferSize(1024);//设置输入缓冲区的大小,Bytesﻩm_Com.SetOutBufferSize(512);//设置输入缓冲区的大小,Bytesﻩ//打开串口 if(!m_Com.GetPortOpen())ﻩﻩm_Com.SetPortOpen(TRUE);ﻩm_Com.SetInputMode(1); //设置输入方式为二进制方式 m_Com.SetSettings("9600,n,8,1");//设置波特率等参数 m_Com.SetRThreshold(1);//为1表示有一个字符引发一个事件ﻩm_Com.SetInputLen(0);而后,生成“启动”按钮的点击事件,在函数中添加定时器,代码如下;m_timer=SetTimer(1,1000,0);ﻩ最后,添加发送数据的函数SendData()代码ﻩcharTxData[100];intCount=m_pData[index].GetLength();ﻩ//将CString转换成char[] for(inti=0;i<Count;i++) TxData[i]=m_pData[index].GetAt(i); //使用CByteArray发送数据CByteArrayarray;array.RemoveAll();array.SetSize(Count);for(i=0;i<Count;i++)ﻩarray.SetAt(i,TxData[i]);ﻩ//发送数据m_Com.SetOutput(COleVariant(array));5.2.2接收端的体系结构设计5.2.3.1发送端使用WindowsAPI实现串口数据的接收。ﻩ 要从串口接收数据,首先要连接上串口,主要步骤如下: if(!OpenConnection()) ﻩAfxMessageBox("串口连接失败!");(1)打开存在的串口ﻩm_hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPE,NULL);//重叠方式ﻩif(m_hCom==INVALID_HANDLE_VALUE)ﻩ returnFALSE;(2)初始化串口ﻩSetupComm(m_hCom,MAXBLOCK,MAXBLOCK);ﻩSetCommMask(m_hCom,EV_RXCHAR);//把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作 TimeOuts.ReadIntervalTimeout=MAXDWORD; TimeOuts.ReadTotalTimeoutMultiplier=0;ﻩTimeOuts.ReadTotalTimeoutConstant=0;SetCommTimeouts(m_hCom,&TimeOuts);(3)串口配置DCBdcb;ﻩif(!GetCommState(m_hCom,&dcb)) returnFALSE; dcb.fBinary=TRUE; dcb.BaudRate=9600;//数据传输速率 dcb.ByteSize=8;//每字节位数ﻩdcb.fParity=TRUE;ﻩdcb.Parity=NOPARITY;//奇偶校验设置 dcb.StopBits=ONE5STOPBITS;//停止位ﻩ//硬件流控制设置 dcb.fOutxCtsFlow=TRUE; dcb.fRtsControl=TRUE;ﻩ//XON/XOFF流控制设置 dcb.fInX=dcb.fOutX=TRUE;ﻩdcb.XonChar=XON;ﻩdcb.XoffChar=XOFF; dcb.XonLim=50; dcb.XoffLim=50;ﻩreturnSetCommState(m_hCom,&dcb);(4)串口配置成功之后,创建接收线程ﻩm_pThread=AfxBeginThread(CommProc,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);//创建并挂起线程 if(m_pThread==NULL)//创建线程失败则返回ﻩﻩ{ﻩ CloseHandle(m_hCom); ﻩreturnFALSE;ﻩ }ﻩ elseﻩﻩ{ﻩﻩ m_bConn=TRUE; ﻩﻩm_pThread->ResumeThread();//恢复线程运行ﻩﻩ} (5)添加OnCommNotify消息事件函数,其功能是串口数据的接收 查询是否是EV_RXCHAR事件,不是则结束if(!pDoc->m_bConn||(wParam&EV_RXCHAR)!=EV_RXCHAR)?{SetEvent(pDoc->m_hPostMsgEvent);//允许发送下一个WM_COMMNOTIFY消息return0L;}5.2.3.2数据接收的数据处理,调用AISTool类中的函数(1)首先对接收的数据进行CRC校验,根据规定算法生成CRC码的int类型将高、低4位的整数转换为16进制,这里使用了查表法。//数据unsignedchar*tempData intcs=0; inttempcs=0; intitemphigh=0;ﻩintitemplow=0;ﻩfor(inti=0;i<length;i++)//length数据长度tempData { ﻩcs=cs^tempData[i]; }ﻩ tempcs=cs; //高4位的整数值 tempcs=tempcs>>4; itemphigh=tempcs; tempCrc+=pCRCLook[itemphigh];//低4位的整数值cs=cs<<28;cs=cs>>28;itemplow=cs;(2)接下进行数据格式的验证,代码比较简单 a)必须有6个逗号ﻩb)第4个字符串可以为空,其他不能为空,有些必须是有大小范围的数字 c)数据必以!号开始,*号结束,字符串结尾必须是<CR><LF>ﻩ下面给出了根据逗号对字符串进行拆分的代码:CStringsplitTemp; for(inti=0;i<7;i++)ﻩ{ …………….ﻩ} returnTRUE;(3)解封装的过程是比较简单的,只是将提取倒数第一个子字符串,所以在进行数据处理的时候,将倒数第二个子字符串保存下来即可。(4)格式转换,根据图2.5.3的算法进行转换,转换成6比特二进制串。主要代码如下://(1)获取单个字符ASCIIﻩﻩdata=m_strAisEndData.GetAt(i); ﻩ//(2)转换成ASCII对应的整数ﻩﻩstrTemp.Format("%d",data); asciiInt=atoi(strTemp); ﻩ//(3)转换为6位二进制对应的整数 ﻩ…………….. }ﻩﻩ//(5)整合数据ﻩ m_strAis6EndData+=everySixData;(5)根据表2.4.5对数据进行解码,当然每个属性有各自的解码算法。以经度为例,经度的解码算法如下 intdeg,min,sec;//度分秒ﻩ intlength=strtemp.GetLength(); intNum;ﻩCStringstrSub=strtemp.Right(length-1); Num=this->ConverBinaryToInt(strSub);ﻩfloatn=(float)Num/(10000*60); deg=int(n); min=int((n-deg)*60);ﻩsec=int((n-deg)*60-min);ﻩif(strtemp.GetAt(0)=='1') ﻩﻩ{ ais_Long.Format("%3d°%02d′%02d″西",deg,min,sec);ﻩ}ﻩelse {ﻩ ais_Long.Format("%3d°%02d′%02d″东",deg,min,sec); ﻩ }(6)使用ADO数据库访问技术,将成功接收并解码后的数据插入数据库的AIS关系表中。实现步骤如下://(1)这就是初始化COM库ﻩif(!AfxOleInit()) { ﻩAfxMessageBox("OLE初始化出错!"); returnFALSE; } //(2)创建Connection实例if(FAILED(m_pConn.CreateInstance(__uuidof(Connection)))){ AfxMessageBox("创建Connection实例失败!");ﻩﻩreturnFALSE;ﻩ}ﻩ //(3)连接数据库ﻩC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- AI在舞蹈编导中的应用
- 2026年学校信息化设备维护保养与报废更新机制
- 2026年农机智能调度管理系统项目计划
- 2026年幼儿园户外活动组织与安全防护
- 2025湖南省中考地理试题(原卷版)
- 2026年红楼梦王熙凤管理才能探析
- 2026年大学生常见传染病预防与校园卫生
- 上海立达学院《安全生产法律法规》2025-2026学年第一学期期末试卷(B卷)
- 脂肪酸与神经生长因子作用
- 2026年旅游民宿等级评定申请报告模板
- 2026年设备出售转让合同(1篇)
- 2026年事业单位面试结构化100例
- 河南省农村中小学闲置校园校舍的调查与再生路径研究
- 黑龙江省控制性详细规划编制规范
- 饮用水水质PH值安全控制检测标准
- 骨科护理常规与护士专业素养提升
- 物业电工安全操作培训课件
- 机房精密空调更换施工方案
- (2025年)吉林事业单位考试真题附答案
- 公安预审学课件
- 风险评估与管理矩阵表全面分析版
评论
0/150
提交评论