STM32基于HAL解析GPS经度纬度以及时间

1、硬件选型(GPS模块)

 2、STM32基于HAL实现过程

第一部分:CubeMX配置过程

第一步:打开CubeMX工具:

第二步:创建一个工程:搜索一下需要的芯片。

 第三步:配置调试器

第四步:配置时钟

第五步: 配置时钟树,在下图所示出输入,点击回车即可。

 第六步:配置串口

 第七步:

第二部分: 代码编写

第一步:定义一个用于存放经度纬度的缓存结构体

struct student
{
	uint8_t longitude[9];//经度
	uint8_t latitude[9];//纬度
	uint8_t time[6];//时间
	bool connect;//连接
};


struct student demo;//经度纬度等信息

第二步:定义所需要的变量以及数组

uint8_t message[200] = {0}; //接收字符串缓冲区
uint8_t offset; //接收字符串缓冲区的下标及大小
uint8_t mesg; //用于中断时,接收单个字符
uint8_t RX_Flag; //发生中断的标志
uint8_t data[500];
uint8_t dem[10];

第三步:编写接收解析GPS的函数

/*GPS解析采集*/
void gather_GPS(){
		HAL_UART_Receive(&huart2,data,500,1000);
		for(int i=0;i<500;i++){
			if(data[i]=='$'&&data[i+1]=='G'&&data[i+2]=='N'&&data[i+3]=='R'&&data[i+4]=='M'&&data[i+5]=='C'){
					if(i+42>=500){
							break;
					}
					/*北纬转化*/
					OLED_ShowChar(0,0,data[i+20]);
					OLED_ShowChar(0+8,0,data[i+21]);
					OLED_ShowChar(0+8+8,0,data[i+22]);
					OLED_ShowChar(0+8+8+8,0,data[i+23]);
					OLED_ShowChar(0+8+8+8+8,0,data[i+24]);
					OLED_ShowChar(0+8+8+8+8+8,0,data[i+25]);
					OLED_ShowChar(0+8+8+8+8+8+8,0,data[i+26]);
					OLED_ShowChar(0+8+8+8+8+8+8+8,0,data[i+27]);
					OLED_ShowChar(0+8+8+8+8+8+8+8+8,0,data[i+28]);
					OLED_ShowChar(0+8+8+8+8+8+8+8+8+8,0,data[i+29]);
					OLED_ShowChar(0+8+8+8+8+8+8+8+8+8+8,0,data[i+19]);
					OLED_ShowChar(0+8+8+8+8+8+8+8+8+8+8+8,0,data[i+18]);
					demo.latitude[0]=data[i+20];
					demo.latitude[0]=data[i+21];
					demo.latitude[0]=data[i+22];
					demo.latitude[0]=data[i+23];
					demo.latitude[0]=data[i+24];
					demo.latitude[0]=data[i+25];
					demo.latitude[0]=data[i+26];
					demo.latitude[0]=data[i+27];
					demo.latitude[0]=data[i+28];
					demo.latitude[0]=data[i+29];
					/*东经转化*/
//					OLED_ShowChar(0,2,data[i+30]);
					OLED_ShowChar(0,2,data[i+31]);
					OLED_ShowChar(0+8,2,data[i+32]);
					OLED_ShowChar(0+8+8,2,data[i+33]);
					OLED_ShowChar(0+8+8+8,2,data[i+34]);
					OLED_ShowChar(0+8+8+8+8,2,data[i+35]);
					OLED_ShowChar(0+8+8+8+8+8,2,data[i+36]);
					OLED_ShowChar(0+8+8+8+8+8+8,2,data[i+37]);
					OLED_ShowChar(0+8+8+8+8+8+8+8,2,data[i+38]);
					OLED_ShowChar(0+8+8+8+8+8+8+8+8,2,data[i+39]);
					OLED_ShowChar(0+8+8+8+8+8+8+8+8+8,2,data[i+40]);
					OLED_ShowChar(0+8+8+8+8+8+8+8+8+8+8,2,data[i+41]);
					OLED_ShowChar(0+8+8+8+8+8+8+8+8+8+8+8,2,data[i+42]);
					demo.longitude[0]=data[i+33];
					demo.longitude[0]=data[i+34];
					demo.longitude[0]=data[i+35];
					demo.longitude[0]=data[i+36];
					demo.longitude[0]=data[i+37];
					demo.longitude[0]=data[i+38];
					demo.longitude[0]=data[i+39];
					demo.longitude[0]=data[i+40];
					demo.longitude[0]=data[i+41];
					demo.longitude[0]=data[i+42];
					/*时间转化*/
					OLED_ShowChar(0,4,data[i+7]);
					OLED_ShowChar(0+8,4,data[i+8]);
					OLED_ShowChar(0+8+8,4,data[i+9]);
					OLED_ShowChar(0+8+8+8,4,data[i+10]);
					OLED_ShowChar(0+8+8+8+8,4,data[i+11]);
					OLED_ShowChar(0+8+8+8+8+8,4,data[i+12]);
					demo.time[0]=data[i+7];
					demo.time[0]=data[i+8];
					demo.time[0]=data[i+9];
					demo.time[0]=data[i+10];
					demo.time[0]=data[i+11];
					demo.time[0]=data[i+12];
					HAL_Delay(10);
					break;
			}
			
			if(data[i]=='$'&&data[i+1]=='G'&&data[i+2]=='P'&&data[i+3]=='T'&&data[i+4]=='X'&&data[i+5]=='T'&&data[i+24]=='O'&&data[i+25]=='K'){
				if(i>25){break;}
				demo.connect=true;
				break;
			}
			else{
				demo.connect=false;
				break;
			}
		}
}

第四步:在while中调用

  /* USER CODE BEGIN WHILE */
  while (1)
  {
		gather_GPS();
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

然后编译下载到板子里即可完成,

工程是通过OLED显示的,有需要大家可以自行下载

  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值