GPS模块的使用其实仅仅是一个串口应用的例子。实际只是直接使用串口就可以工作,底层串口驱动已经由MTK全部完成了。 MTK 串口有自已封装的一套接口函数,详见 Uart_dispatch.c 。驱动原文件在 Uart.c。 与WIN32不同的是,MTK所有的串口都在 drv_comm.c 文件中已经打开过了。所以在使用的时候,不需要再次打开,MTK采用了一种ower的方式,将串口指定给一个模块。这样在每次收到数据后,串口都会向指定模块发送一条消息,消息号:MSG_ID_UART_READY_TO_READ_IND。因而,我们只须要创建一个自已的模块,并且在消息循环中处理这条消息,函数UART_GetBytes 和UART_PutBytes 就可以实现对串口的收和发。 下面写出过程:
1、 创建一个处理串口消息的服务TASK。我们使用的是MOD_CUSTOM2。先在
custom_config.c 文件中启用宏 #define CUSTOM2_EXIST; 2、 在TASK进入消息循环前,初始化串口,波特率等。
UART_SetOwner(uart_port2, MOD_CUSTOM2); // 串口归custom2所有
UART_SetBaudRate(uart_port2, UART_BAUD_9600 ,MOD_CUSTOM2); // 波特率 UART_ClrRxBuffer(uart_port2,MOD_CUSTOM2); // 清接收缓充区 UART_ClrTxBuffer(uart_port2,MOD_CUSTOM2); // 清发送缓充区
3、 在消息循环中,处理数据事件。每次读取20个字节,直到读出的长度小于20,说
明接收缓冲已经空了。GPS_LineCheck这个函数是我写的处理函数,用来将所有收到的零散数据重新组合,并一行一行进行处理。 case MSG_ID_UART_READY_TO_READ_IND: do {
memset(szBuf, 0, 21); iRead = UART_GetBytes(uart_port2,szBuf, 20, &status, MOD_CUSTOM2); GPS_LineCheck(szBuf); }while(iRead >= 20 ); Break;
4、 发送数据时没有限制,可以直接调用 Uart_PutBytes 进行发送。我们暂时没有使用。
二、GPS模块电源控制
对照原理图,直接查出模块对应的电源控制引脚,通过IO操作命今,置高置低。从而实现GPS电源开关控制。
GPIO_InitIO(OUTPUT,43); // 我们使用的是GPIO 43 GPIO_ModeSetup(43, 0); GPIO_WriteIO(0, 43);
三、GPS内容的提取。
可以参考我们的代码。GPS采用的是NEMA协议。网上有详细针对该协议的说明文档,后面的第六条有详述。主要是以行为数据单位,以逗号为分隔符,将经纬度等数据以广播的方式发送。我们要做的,仅仅是根据头字段(即 $GPGGA 等),提取出相应的数据行,并从中解析出我们需要的数据。须要注意的是,存在一定的乱码错误,要注意捕捉各种异常。特别是在GPS模块刚启动的瞬间。
四、坐标数据的运算。
GPS模块出来的数据有三种表示方式,度、度分、度分秒。 例如: 22.889652°度表示法 转换为度分
889652 × 0.6 = 533791 也就是 22°53.3791′ 转换为度分秒 3791 × 0.6 = 2275 也就是 22°53′22.75″ 而由度分秒的转换则是上述过程的相反,即 ÷ 0.6。
五、GPS数据均衡
目前采用了最简易的处理方法,可能还要进行改进。 假设当前坐标为 X0 ,GPS块新送出的坐标为X1
则本次生成的坐标值为 ( 系数 × X0 + X1 ) ÷ ( 系数 + 1 ),目前系统数选择为3。
六、【GPS】NEMA协议
NMEA传输信号
GM-270智能型卫星接收器,由美国瑟孚公司(SiRF)提供技术支持,采NMEA-0183标准输出格式。一般的NMEA默认值为:传输速率(Baud Rate) 4800 bps;资料位:8 bits,停止位(stopbit) 及无极性输出(no parity).
NMEA 记录说明:
1、GGA :定位后卫星定位信息
2、GSA :一种偏差信息, 说明卫星定位信号的强弱状态 3、GSV :GNSS天空范围内的卫星
4、RMC :为达定位目的而为最低度需求的GNSS信息
6.1、定位后卫星定位信息(GGA) 输出范例:
$GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1.0,9.0,M, , , ,0000*18
GGA 资料格式 名称实例单位叙述讯息代号$GPGGA GGA 规范表头
标准定位时间161229.487 时时分分秒秒.秒秒秒 纬度3723.2475 度度分分.分分分分
北/南半球指示器N 北半球(N)或南半球(S) 经度12158.3416 度度度分分.分分分分
东/西半球指示器W 东半球(E)或西半球(W) 定位代号指示器1 参考表2-3
使用中的卫星数目07 (范围00 to 12) 水平稀释精度1.0 (范围0.5 ~ 99.9米)
海拔高度9.0 米(范围-9999.9至99999.9米) 单位M 米
大地水准面分隔米 单位M 米
差分修正秒0表非DGPS 基地台代码0000 总和检查码*18 讯息终点
定位代号指示器 数值叙述
0 未定位或无效的定位 1 GPS SPS格式, 己定位
2 差分修正, SPS格式, 已定位 3 GPS PPS格式, 己定位
6.2、偏差信息(GNSS DOP) 及卫星状态(GSA) 输出范例:
$GPGSA,A,3,07,02,26,27,09,04,15, , , , , ,1.8,1.0,1.5*33
GSA 资料格式 名称实例单位叙述
讯息代号$GPGSA GSA规范表头 模式1 A 参阅表2-5 模式2 3 参阅表2-6
使用中的卫星数目07 Channel 1 使用中的卫星数目02 Channel 2 …… ….
使用中的卫星数目Channel 12 位置精度稀释值1.8 0.5 ~ 99.9 水平精度稀释值1.0 0.5 ~ 99.9 垂直精度稀释值1.5 0.5 ~ 99.9 *33
讯息终点1. Satellite used in solution.
数值叙述
M 手动– 只能于二维定位或三维定位模式运作 A 自动– 允许自动切换二维定位或三维定位模式 表2-6 模式2 叙述
1 未定位 2 二维定位 3 三维定位
6.3、GNSS 所在位置天空中的卫星(GSV) 输出范例:
$GPGSV,2,1,07,07,79,048,42,02,51,062,43,26,36,256,42,27,27,138,42*71 $GPGSV,2,2,07,09,23,313,42,04,19,159,41,15,12,041,42*41 表2-7 GSV 资料格式 名称实例单位叙述
讯息代号$GPGSV GSV 规范表头 讯息总数2 1 至3 讯息号码1 1 至3 天空中卫星总数07
卫星编号07 频道1 (01 到32)
卫星仰角79 度频道1 (最大值90 度)
卫星方位角048 度频道1 (000 至359 度. 实际值)
信号噪声比(C/No) 42 dBHz 00 至99dB 0 表未接收到信号 .... ....
卫星编号27 频道4 (01 到32)
卫星仰角27 度频道4 (最大值90 度)
卫星方位角138 度频道4 (000 至359 度. 实际值)
信号噪声比(C/No) 42 dBHz 00 至99 dB 0 表未接收到信号 总和检查码*71 讯息终点
注意! ,,和 项个别卫星会重复出现,每行最多有四颗卫星,其余卫星信息会于次 一行出现,若未使用这些字段会空白。
6.4、建议最基本的GNSS规格数据(RMC) 输出范例:
$GPRMC,161229.487,A,3723.2475,N,12158.3416,W,0.13,309.62,120598, ,*10 表2-8 RMC 资料格式 名称实例单位叙述
讯息代号$GPRMC RMC规范表头
标准定位时间161229.487 时时分分秒秒.秒秒秒 定位状态A A= 资料有效; V = 资
料无效 纬度3723.2475 度度分分.分分分分
北/南半球指示器N 北半球(N)或南半球(S) 经度12158.3416 度度度分分.分
分分分
东/西半球指示器W 东半球(E)或西半球(W) 对地速度0.13 节
对地方向309.62 度实际值 日期120598 日日月
月年年
磁极变量度东半球(E)或西半球(W) 总和检查码*10