news 2026/1/22 12:51:49

一、基于freertos系统上关于ATGM336H定位模块的定位测试验证

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一、基于freertos系统上关于ATGM336H定位模块的定位测试验证

一、硬件连接

模块引脚 连接目标 说明
TX 串口助手接收端(RX) 交叉连接,用于模块发送数据到上位机
RX 不接 测试阶段无需发送指令,可悬空
VCC 5V/3.3V 根据模块版本选择:多数ATGM336H型号需5V供电(具体以规格书为准)
GND GND 必须与上位机共地,否则会导致数据乱码或通信失败
注意
1、模块上的led灯闪烁时,相当于提示定位信息获取到了,常量表示定位失效。
2、断电重启模块,更新信息状态。
3、定位时,天线上的陶瓷片向上(陶瓷片上的金属小点一面朝向天空),朝向空旷的天空,高楼会遮挡信号导致定位不到。
4、模块的通信默认用9600波特率通信的。

二、代码部分

定义部分

#defineDMA_BUF_SIZE256// DMA接收缓冲区大小#defineNMEA_QUEUE_LEN8// NMEA帧队列长度#defineGNGGA_HEAD"$GNGGA"#defineLAT_LON_SCALE60.0f// 度分转度的系数#defineGNGGA_MIN_FIELD_CNT6typedefstruct{uint8_tvalid;// 定位有效标志(1有效,0无效)chartime[7];// UTC时间(HHMMSS)floatlatitude;// 纬度(度)charlat_dir;// 纬度方向(N/S)floatlongitude;// 经度(度)charlon_dir;// 经度方向(E/W)uint8_tsat_num;// 锁定卫星数(新增,适配GNGGA)uint8_tparse_ok;// 解析成功标志}GnssInfo_t;externGnssInfo_t gnss_info;floatnmea_degree_convert(char*str);// 度分转度externuint8_tdma_rx_buf[DMA_BUF_SIZE];externvolatileuint16_tdma_rx_len;// 开启USART2空闲中断__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);// 启动DMA接收(循环模式)HAL_UART_Receive_DMA(&huart2,dma_rx_buf,DMA_BUF_SIZE);voidUSART2_IRQHandler(void){HAL_UART_IRQHandler(&huart2);USART2_IDLE_IRQHandler();// 处理空闲中断}// 打印定位信息voidUSART2_IDLE_IRQHandler(void){if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)!=RESET){__HAL_UART_CLEAR_IDLEFLAG(&huart2);// 清除空闲中断标志HAL_UART_DMAStop(&huart2);// 停止DMA接收// 计算接收长度dma_rx_len=DMA_BUF_SIZE-__HAL_DMA_GET_COUNTER(&hdma_usart2_rx);}}floatnmea_degree_convert(char*str){if(str==NULL||strlen(str)<4||strchr(str,'.')==NULL){return0.0f;}floatdegree=0.0f;floatminute=0.0f;chartemp[16]={0};intdot_pos=strchr(str,'.')-str;// 纬度:DDMM.mmmm → 前2位度if(strlen(str)>=4&&dot_pos>=2){strncpy(temp,str,2);degree=atof(temp);minute=atof(str+2);}// 经度:DDDMM.mmmm → 前3位度elseif(strlen(str)>=5&&dot_pos>=3){strncpy(temp,str,3);degree=atof(temp);minute=atof(str+3);}else{return0.0f;}// 防止转换后为0(有效经纬度不可能为0)floatres=degree+(minute/LAT_LON_SCALE);return(res>0.0f)?res:0.0f;}

任务调用部分

//获取信息voidStartTask01(void*argument){uint8_tnmea_buf[DMA_BUF_SIZE]={0};for(;;){if(dma_rx_len>0){// 拷贝DMA接收的数据到临时缓冲区memcpy(nmea_buf,dma_rx_buf,dma_rx_len);nmea_buf[dma_rx_len]='\0';// 字符串结束符//输出串口接收信息HAL_UART_Transmit(&huart1,(uint8_t*)&dma_rx_buf,dma_rx_len,8000);printf("\r\n");// 发送到NMEA解析队列osMessageQueuePut(myQueue01Handle,nmea_buf,0,100);// 重置DMA接收dma_rx_len=0;memset(dma_rx_buf,0,DMA_BUF_SIZE);HAL_UART_Receive_DMA(&huart2,dma_rx_buf,DMA_BUF_SIZE);}osDelay(5);}}//解析部分voidStartTask02(void*argument){uint8_tnmea_buf[DMA_BUF_SIZE]={0};for(;;){// 解析任务核心逻辑if(osMessageQueueGet(myQueue01Handle,nmea_buf,NULL,100)==osOK){gnss_info.parse_ok=0;char*gngga_frame=strstr((char*)nmea_buf,GNGGA_HEAD);if(gngga_frame!=NULL&&strlen(gngga_frame)>20){char*token=NULL;char*save_ptr=NULL;intfield_idx=0;intfield_cnt=0;// 临时变量:先存储经纬度字符串,等定位质量解析后再转换charlat_str[16]={0};charlon_str[16]={0};token=strtok_r(gngga_frame,",",&save_ptr);while(token!=NULL){field_cnt++;if(strlen(token)==0){token=strtok_r(NULL,",",&save_ptr);field_idx++;continue;}switch(field_idx){case0:// $GNGGA:帧头校验if(strcmp(token,GNGGA_HEAD)!=0){field_idx=-1;break;}break;case1:// UTC时间(HHMMSS.ss)if(strlen(token)>=6){strncpy(gnss_info.time,token,6);gnss_info.time[6]='\0';}else{memset(gnss_info.time,0,sizeof(gnss_info.time));}break;// 先存储经纬度字符串(不立即转换)case2:// 纬度字符串(DDMM.mmmm)strncpy(lat_str,token,sizeof(lat_str)-1);break;case3:// 纬度方向(N/S)if(token[0]=='N'||token[0]=='S'){gnss_info.lat_dir=token[0];}else{gnss_info.lat_dir='\0';}break;case4:// 经度字符串(DDDMM.mmmm)strncpy(lon_str,token,sizeof(lon_str)-1);break;case5:// 经度方向(E/W)if(token[0]=='E'||token[0]=='W'){gnss_info.lon_dir=token[0];}else{gnss_info.lon_dir='\0';}break;case6:// 定位质量(核心:先解析!)gnss_info.valid=(atoi(token)==1)?1:0;// 定位有效时,再转换经纬度(关键修复!)if(gnss_info.valid){if(strlen(lat_str)>=4)gnss_info.latitude=nmea_degree_convert(lat_str);if(strlen(lon_str)>=5)gnss_info.longitude=nmea_degree_convert(lon_str);}break;case7:// 卫星数gnss_info.sat_num=atoi(token);break;default:if(field_idx>=8)// 解析到卫星数后停止{token=NULL;break;}break;}if(field_idx==-1){token=NULL;break;}token=strtok_r(NULL,",",&save_ptr);field_idx++;}// 放宽最终校验条件(适配实际场景)if(field_cnt>=7// 至少7个字段(核心字段)&&gnss_info.valid==1// 定位质量=1&&gnss_info.lat_dir!='\0'// 纬度方向有效&&gnss_info.lon_dir!='\0'// 经度方向有效&&gnss_info.latitude>0.0f// 纬度>0(有效范围)&&gnss_info.longitude>0.0f// 经度>0(有效范围)&&gnss_info.sat_num>=1)// 卫星数≥1(放宽){gnss_info.parse_ok=1;// 【调试打印】解析成功提示printf("解析成功!纬度:%.6f%c,经度:%.6f%c,utc时间:%s,定位质量=%d,卫星数=%d\r\n",gnss_info.latitude,gnss_info.lat_dir,gnss_info.longitude,gnss_info.lon_dir,gnss_info.time,gnss_info.valid,gnss_info.sat_num);}else{memset(&gnss_info,0,sizeof(GnssInfo_t));printf("解析失败:字段数=%d,定位质量=%d,卫星数=%d\r\n",field_cnt,gnss_info.valid,gnss_info.sat_num);}}}osDelay(10);}}

测试效果示意图:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/15 17:01:36

终极船舶水动力学与运动控制实践指南:从建模到仿真的完整技术路径

《Fossen Handbook》作为海洋工程领域的技术权威著作&#xff0c;系统整合了船舶水动力学建模与运动控制算法的前沿研究成果。本指南将带你深入掌握这一权威资源的核心价值&#xff0c;实现从理论到工程实践的跨越。 【免费下载链接】FossenHandbook Handbook of Marine Craft …

作者头像 李华
网站建设 2026/1/17 21:10:15

揭秘Whisper.cpp:如何用离线语音识别技术解决真实业务痛点

在数字化转型浪潮中&#xff0c;语音识别技术正成为提升用户体验的关键要素。然而&#xff0c;传统的云端语音识别方案往往面临隐私泄露、网络延迟、成本高昂等现实问题。作为OpenAI Whisper模型的C/C移植版本&#xff0c;Whisper.cpp提供了一个突破性的离线解决方案&#xff0…

作者头像 李华
网站建设 2026/1/17 17:32:53

RustDesk服务器高效部署攻略:5步打造企业级远程访问平台

RustDesk服务器高效部署攻略&#xff1a;5步打造企业级远程访问平台 【免费下载链接】rustdeskinstall Easy install Script for Rustdesk 项目地址: https://gitcode.com/gh_mirrors/ru/rustdeskinstall 想要摆脱传统远程桌面软件的复杂配置和性能瓶颈&#xff1f;Rust…

作者头像 李华
网站建设 2026/1/21 20:15:13

Lumafly模组管理器:Hollow Knight玩家的终极跨平台解决方案

还在为《空洞骑士》模组安装的复杂流程而烦恼吗&#xff1f;Lumafly模组管理器将彻底改变你的游戏体验&#xff01;这款基于Avalonia框架开发的跨平台工具&#xff0c;让Windows、macOS和Linux用户都能享受到真正智能化的模组管理服务。无论你是模组新手还是资深玩家&#xff0…

作者头像 李华
网站建设 2026/1/20 11:46:31

探索硬件检测的5个高效方法:系统信息获取完全指南

探索硬件检测的5个高效方法&#xff1a;系统信息获取完全指南 【免费下载链接】hwinfo cross platform C library for hardware information (CPU, RAM, GPU, ...) 项目地址: https://gitcode.com/gh_mirrors/hw/hwinfo 在当今数字化时代&#xff0c;深入了解计算机硬件…

作者头像 李华
网站建设 2026/1/20 19:50:50

SpiffWorkflow完全指南:5分钟掌握Python工作流引擎的核心用法

SpiffWorkflow完全指南&#xff1a;5分钟掌握Python工作流引擎的核心用法 【免费下载链接】SpiffWorkflow A powerful workflow engine implemented in pure Python 项目地址: https://gitcode.com/gh_mirrors/sp/SpiffWorkflow SpiffWorkflow是一个完全用Python实现的强…

作者头像 李华