车载导航系统终端的研究
引言
面对庞大的汽车市场以及随着全国各省市高速公路路网的建设与完善,对交通管理信息化的要求越来越高,gps车载系统的潜力不可估量,其发展前景比较乐观。日本和西方各大公司都参与了这场高科技的角逐。各发达国家的很多生产商都加快了车载导航系统的研究步伐。随着嵌入式技术的发展,很多资源不足的瓶颈问题都很大程度上得到了解决。车载定位系统由车载定位终端、无线通信链路和车载监控管理系统三部分组成。其主要功能是将移动目标的动态位置(经度和纬度)、时间和海拔等对用户有用的信息,通过无线通信链路传送到监控中心,而后在电子地图上对移动目标的运动轨迹进行显示,并对车辆的准确位置、速度、运动方向和车辆状态等用户感兴趣的参数进行监控和查询,为调度管理提供可视化依据,提高车辆运行效率,还能起到节能减排的作用。也在一定程度上起到保护地球的作用。本文将gps定位技术应用于气车,与现有定位技术组合起来共同完成定位监控任务,将大大提高定位准确性及安全性,同时能够降低资金投入,具有很广阔的发展空间。
系统总体设计
系统硬件的结构设计
车辆监控系统由车载端(包括arm工控机、触摸屏、gps接收模块和电源等)、通信系统(gprs)、监控中心三大部分组成。车载端的gps模块实时接收全球定位卫星的位置、时间等数据,一方面发送给车内的arm微型工控机,得到车辆的当前位置并且在电子地图上显示:另一方面,数据将通过gprs终端模块发送到远程监控中心服务器,使得监控中心能实时得到所有车辆的位置信息,给车辆的安全监控以及远程凋度提供了基础。通过spi接口与can总线相连,利用can总线挂接传感器,检测汽车主要技术参数,can总线模块可以使本系统与其他车载模块的连接,完成收集车辆的状态信息以及进一步控制。can总线模块主要包括can总线的控制器和收发器,在这里分别选用的是microchip公司的mcp2510和飞利浦公司的pca82c250。其中,can总线控制器mcp2510实现了can总线的协议,can总线收发器pca82c250提供协议控制器和物理传输线路之间的接口。由于can总线控制器mcp2510具有spi接口,因此,系统中将其与s3c2440的spi0相连。故障检测模块主要是对汽车的主要技术参数进行检测,并显示到lcd显示器上,如果检测到故障,会发出报警信号。本文主要检测的技术参数包括燃油消耗量、制动力、转向力、发动机温度、冷却液温度、前照灯,以及车内噪声和尾气等方面。该模块主要是通过各种传感器把各种信号转换为电信号,再利用信号处理电路把电信号进行相应的处理,使其能与can总线模块进行数据传输。车载端的硬件组成框图,如图1所示。
图1 车载端的硬件组成框图
应用程序总结构
应用程序的总体流程图如图2所示。由于gprs模块和gps模块都是通过串口和监控终端连接的,程序系统初始化的工作就是对串口进行初始化,使串口按gprs及gps模块的要求工作。之后创建共享内存是为gprs通信子进程与gps子进程之间的通信做准备。gps子进程负责从串口接收gps信息并把这些信息写入共享内存内,gprs子进程则将共享内存内的gps信息通过网络送到远方的监控服务器。
gps驱动程序的编写
为了使arm上的应用程序能够处理gps接收到的导航信号,要编写gps的驱动程序。
这个gps驱动程序也是属于字符型驱动程序,首先了解嵌入式开发中应用程序、库、内核、驱动程序的关系:应用程序调用应用程序库函数完成功能;应用程序以文件形式访问各种资源;应用程序函数库的一部分直接完成功能,一部分函数通过系统调用由内核完成,内核处理系统调用,调用设备驱动程序,设备驱动程序直接与硬件通信。如图3所示
一般linux的设备驱动有三种类型,字符设备、块设备、网络设备。而我要讲的gps模块的驱动程序是属于字符设备。对于字符设备发出读/写请求时,实际的硬件i/o操作一般紧接着发生。在设备管理中,除了设备类型外,内核还需要一对被称为主从设备号的参数,才能唯一标识一个设备。主设备号相同的设备使用相同的驱动程序,从设备号用于区分具体设备的实例。用命令cat/proc/devices可以查看系统中所有设备对应的主设备号。所以在gps驱动程序的开始定义设备名称#define device_name “s3c2440-gps”再定义主设备号,我是让系统自动分配的,以防主设备号已被占用,static int gps_major=0;驱动程序以一个模块初始化函数作为入口,如module_init(s3c2440_gps_init)向内核声明当前模块的初始化函数;再写gps的初始化函数:static int __init s3c2440_gps_init(void)函数,在这个函数里面注册一个设备,返回主设备号,可以写成:gps_major=register_chrdev(0,device _name,&s3c2440_gps_fops),s3c2440_gps_fops是定义了的结构体,规定了驱动程序向应用程序提供的操作接口。如:static struct file_operations s3c2440_gps _fops ={.owner= this_module,。
open= s3c2440_gps_open,.release= s3c2440_gps_release=s3c2440_gps_release, .ioctl=s3c2440_gps_ioctl};继续向下写,gps_class=class_create(this_module,device_name);在/sysfs目录下创建这个设备的类。再是注册这个设备的类,如device_create(gps_class,null,mkdev(gps_major,0),null,device_name)。
gps应用程序即定位功能的实现
要实现gps的定位必须先要对gps数据包进行解析,gps上电后,每隔一定的时间就会返回一定格式的数据,数据格式为$信息类型,每行开头的字符都是$,接着是信息类型,后面的是数据,以逗号分开,完整的数据类型如下:$gprmc,080655.00,a,4546.40891,n,12639.65641,e,1.045,328.42,170809,,,a*60信息类型为:gpgsv:可见卫星信息、gpgll:地理定位信息、gprmc:推荐最小定位信息、gpvtg:地面速度信息、gpgga:gps定位信息、gpgsa:当前卫星信息、这里我只解析gprmc和gpgga的信息。一.gprmc数据详解:$gprmc,《1》,《2》,《3》,《4》,《5》,《6》,《7》,《8》,《9》,《10》,《11》,《12》*hh《1》utc时间,hhmmss(时分秒)格式《2》定位状态,a=有效定位,v=无效定位《3》纬度ddmm.mmmm(度分)格式(前面的0也将被传输)《4》纬度半球n(北半球)或s(南半球)《5》经度dddmm.mmmm(度分)格式(前面的0也将被传输)《6》经度半球e(东经)或w(西经)……。
最后编写代码,把经/纬度解析出来,对于gpgga类型数据,也是一样,先了解每一位的含义,再写代码把海平面高度和大地水平面高度等数据解析并显示出来。
gprs通信模块实现
gprs模块是借助gprs无线网络实现数据的无线传输,从而在不同的车辆或车辆与控制中心之间架起沟通的桥梁,所以软件的功能主要是建立无线连接,按照gprs通信协议传输数据。gprs模块的通信主要是通过串口驱动实现,在嵌入式linux内核中已经提供了对串设备的支持,因此在配置内核编译选项时,只需要选中对串口设备的支持,就可以实现对gprs模块的串口数据通信功能。为了实现与internet的通信,还需要在配置内核编译选项时选中ppp和tcp/ip协议。这样一旦网络连接建立,就可以使用应用程序来实现网络数据的通信。本系统数据链路层采用ppp协议,它是一种面向字符的协议,是为在两个对等实体间传输数据包连接而设计的,使用可扩展的链路控制协议lcp来建立、配置和测试数据链路。用网络控制协议族ncp来建立和配置不同的网络层协议,并且允许采用多种网络层协议。一个ppp会话分四个步骤:建立连接、连接质量控制、网络层协议配置和连接终止。
嵌入式linux系统内核源自于linux内核,并保留了对tcp/ip以及其他的网络协议的支持。在嵌入式linux系统上编写网络应用程序与在linux上编写网络应用程序没什么大区别,通常只需要做很小的修改就可以移植到嵌入式linux系统上。至此,gprs模块完整地集成到嵌入式终端中。
can模块实现
can总线驱动程序要完成的报文发送、接收等任务都是围绕can总线控制器展开的,因此驱动程序主要是对控制器mcp2510内部寄存器进行操作。can总线控制器mcp2510的初始化按照以下步骤进行:(1)软件复位,进入配置模式;(2)设置can总线波特率;(3)关闭中断,设置id过滤器;(4)切换mcp2510到正常状态;(5)清空接收和发送缓冲区;(6)开启接收缓冲区,开启中断。
实验结果
本实验结果能达到基本的要求,参见图4,图的右上角是经/纬度。本系统还不完善,还有很多实用的功能有待进一步开发。
结论
该系统能够通过gps和gprs实现车辆定位以及车辆与控制中心之间的数据通信,还能够通过can总线检测汽车主要技术参数,为交通道路的智能管理以及汽车的安全驾驶提供了可靠保障。
文章版权归西部工控xbgk所有,未经许可不得转载。