目录
1、GPS模块简介
2、GPS数据格式
3、方案梳理
1、GPS模块简介
全球定位系统(Global Positioning System, GPS)是一种以空中卫星为基础的高精度无线电导航的定位系统,它在全球任何地方以及近地空间都能够提供准确的地理位置、车行速度及精确的时间信息。 GPS 主要由三大组成部分:空间部分、地面监控部分和用户设备部分。 GPS 系统具有高精度、全天候、用广泛等特点。
太空卫星部分由多颗卫星组成,分成多个轨道,绕行地球一周约 12 小时。每个卫星均持续发射载有卫星轨道数据及时间的无线电波,提供地球上的各种接收机来应用。
地面管制部分,这是为了追踪及控制太空卫星运行所设置的地面管制站,主要工作为负责修正与维护每个卫星能够正常运转的各项参数数据,以确保每个卫星都能够提供正确的讯息给使用者接收机来接收使用者接收机(即用户设备),追踪所有的 GPS 卫星,并实时的计算出接收机所在位置的坐标、移动速度及时间。我们日常接触到的是用户设备部分,这里使用到的 GPS 模块即为用户设备接收机部分。
GPS 模块与外部控制器的通讯接口有多种方式,这里我们使用串口进行通讯,波特率为 9600bps,1bit 停止位,无校验位,无流控,默认每秒输出一次标准格式数据。
2、GPS数据格式
GPS 使用多种标准数据格式,目前最通用的 GNSS 格式是 NMEA0183 格式。NMEA0183 是最终定位格式,即将二进制定位格式转为统一标准定位格式,与卫星类型无关。这是一套定义接收机输出的标准信息,有几种不同的格式,每种都是独立相关的 ASCII 格式,逗点隔开数据流,数据流长度从 30-100 字符不等,通常以每秒间隔持续输出。
NVMEA0183 格式主要针对民用定位导航,与专业 RTCM2.3/3.0 和 CMR+的GNSS 数据格式不同。通过 NMEA0183 格式,可以实现 GNSS 接收机与 PC 或 PDA之间的数据交换,可以通过 USB 和 COM 口等通用数据接口进行数据传输,其兼容性高,数据传输稳定。这里我们使用串口进行是通讯,通信框图如下图所示。
图片去看韦老师的图,我这就不放了,这东西科普作用不是今天的重点。
我们使用串口接收数据,收到的数据包含: $GPGGA( GPS 定位数据)、 $GPGLL
(地理定位信息)、 $GPGSA(当前卫星信息)、 $GPGSV(可见卫星状态信息)、$GPRMC(推荐最小定位信息)、 $GPVTG(地面速度信息)。这里我们只分析$GPGGA (Global Positioning System Fix Data)即可,它包含了 GPS 定位经纬度、质量因子、 HDOP、高程、参考站号等字段。其标准格式如下
$GPGGA, <1>, <2>, <3>, <4>, <5>, <6>, <7>, <8>, <9>, M, <10>, M, <11>, <12>*hh<CR><LF>
$XXGGA 语句各字段的含义和取值范围各字段的含义和取值范围见下表所示,
XX 取值有:
◼ GPGGA:单 GPS
◼ BDGGA:单北斗
◼ GLGGA:单 GLONASS
◼ GNGGA:多星联合定位
3、方案梳理
为什么会有这个东西,因为GPS只能在户外用。喵的我没法演示所以我想个办法把他用上咋用呢就是看图
这样我把32拿到户外然后通过zigbee发给6ull就完美解决了。有人说为啥不直接把6ull拿户外呢。没法供电呀DC供电8~12V的。我不想在搭进去个供电模块。
代码我啪的一下就写完了哈哈测试一下
斯乱码。
拿外面试试
据说数据格式应该是这样滴
但是我们全是FF和99就离谱
现在是直接转发的我修改下程序试试
经过我的不懈努力,不调了气死了
直接怼串口拿到室外都不好使
不过32的代码还是给大家做个参考吧
不是代码的问题是硬件问题。
/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "bsp/usart/bsp_debug_usart.h"
#include "bsp/usart/bsp_usartx.h"
#include "bsp/systick/bsp_SysTick.h"
#include "bsp/i2c/bsp_i2c_OLED.h"
#include "bsp/led/bsp_led.h"
#include <stdlib.h>
#include <string.h>
/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
/* 私有变量 ------------------------------------------------------------------*/
/* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
/* 函数体 --------------------------------------------------------------------*/
/* 扩展变量 ------------------------------------------------------------------*/
uint8_t Rxflag=0;
char ucTemp;
uint16_t usRxCount;
char ucaRxBuf[256];
u32 send_data()
{
char tmp[10];
char *time, *lat, *ns, *lng, *ew;
float fLat, fLng;
char Lat[100];
char Lng[100];
if (ucaRxBuf[0] != '$')
{
printf("\r\n $ >>> %s\r\n",ucaRxBuf);
usRxCount = 0;
memset(ucaRxBuf,0,256);
return 1;
}
else if (strncmp(ucaRxBuf+3, "GGA", 3) != 0)
{
printf("\r\n GGA >>> %s\r\n",ucaRxBuf);
usRxCount = 0;
memset(ucaRxBuf,0,256);
return 1;
}
else if (strstr(ucaRxBuf, ",,,,,"))
{
printf("Place the GPS to open area\r\n");
printf("\r\n ,,,,,, >>> %s\r\n",ucaRxBuf);
usRxCount = 0;
memset(ucaRxBuf,0,256);
return 1;
}
else {
printf("raw data: %s\r\n", ucaRxBuf);
// sscanf(ucaRxBuf, "%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]", tmp, time, lat, ns, lng, ew);
// printf("Time : %s\n", time);
// printf("ns : %s\n", ns);
// printf("ew : %s\n", ew);
// printf("Lat : %s\n", Lat);
// printf("Lng : %s\n", Lng);
// /* 纬度格式: ddmm.mmmm */
// sscanf(Lat+2, "%f", &fLat);
// fLat = fLat / 60;
// fLat += (Lat[0] - '0')*10 + (Lat[1] - '0');
// /* 经度格式: dddmm.mmmm */
// sscanf(Lng+3, "%f", &fLng);
// fLng = fLng / 60;
// fLng += (Lng[0] - '0')*100 + (Lng[1] - '0')*10 + (Lng[2] - '0');
// printf("Lng,Lat: %.06f,%.06f\n", fLng, fLat);
return 0;
}
}
void read_data()
{
int i = 0;
int start = 0;
while (1)
{
if(Rxflag)
{
if (ucTemp == '$')
start = 1;
if (start)
{
ucaRxBuf[i++] = ucTemp;
}
if(i == 255)
{
i =0;
printf("%s", ucaRxBuf);
}
/* 遇到换行字符,认为接收到一个命令 */
// if (ucTemp == '\n' || ucTemp == '\r') /* 换行字符 */
// {
// send_data();
// usRxCount = 0;
// //memset(ucaRxBuf,0,256);
// }
Rxflag=0;
}
}
}
/**
* 函数功能: 主函数.
* 输入参数: 无
* 返 回 值: 无
* 说 明: 无
*/
int main(void)
{
/* 简单的通信协议,遇到回车换行符认为1个命令帧 */
/* 调试串口初始化配置,115200-N-8-1.使能串口发送和接受 */
DEBUG_USART_Init();
USARTx_Init();
/* 初始化系统滴答定时器 */
SysTick_Init();
OLED_Init();
LED_GPIO_Init();
/* 无限循环 */
while (1)
{
/**
* 接收串口的数据,分析并处理
* 可以将此段代码封装为一个函数,在主程序其它流程调用
*/
read_data();
}
}
/******************************************************************************/
/* STM32F10x Peripherals Interrupt Handlers */
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
/* available peripheral interrupt handler's name please refer to the startup */
/* file (startup_stm32f10x_xx.s). */
/******************************************************************************/
void USARTx_IRQHANDLER(void)
{
if(USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET)
{
Rxflag=1;
ucTemp = USART_ReceiveData(USARTx);
}
}