网页设计网站名称the7 wordpress theme
网页设计网站名称,the7 wordpress theme,电子商务网站建设模式,ai免费logo设计一键生成文章目录一、ATGM336H 1、简介 2、引脚说明 3、数据帧二、实例代码一、ATGM336H 1、简介 ATGM336H 是一款由中科微电子设计生产的中高精度、高性能 GNSS 定位模块。 支持的卫星系统#xff1a; 支持 BDS、GPS、GALILEO、QZSS、IRNSS 等…文章目录一、ATGM336H1、简介2、引脚说明3、数据帧二、实例代码一、ATGM336H1、简介ATGM336H 是一款由中科微电子设计生产的中高精度、高性能 GNSS 定位模块。支持的卫星系统支持 BDS、GPS、GALILEO、QZSS、IRNSS 等卫星导航系统可接收 B1I、B1C、B2a、L1、L5、E1、E5a 等多频点信号还支持 SBAS 星基增强系统。性能指标水平定位精度CEP50可达 1.0m冷启动时间为 20s热启动时间为 1s重捕获时间为 1s跟踪灵敏度可达 - 162dBm冷启动捕获灵敏度为 - 148dBm。功耗与供电功耗为 31mA3.3V主电源供电电压为 2.7V 至 3.6V。数据输出输出频率最高为 10Hz默认波特率为 115200数据格式为 NMEA0183。尺寸与封装封装尺寸为 10.1mm×9.7mm×2.1mm。特点模块提供标准的 UART 串行接口也可选择支持 I2C 接口内置 1PPS 秒脉冲输出可提供高精度的时间同步信号。此外模块还支持 AGNSS 功能可利用网络辅助数据加速定位。应用领域适用于共享单车、电单车、宠物跟踪器等多种场景还可用于车载导航、便携式手持设备、无人机、物联网设备等。2、引脚说明如果单纯做定位只需要前4个引脚即可也即PPS引脚用不到所以我们PPS这个引脚可以不接空着就行。3、数据帧GPS模块通过串口将数据发给主控芯片ATGM336H会一次性返回多条信息其中信息头的第一个是消息ID标示着通过什么定位系统的采集的数据。本次学习只关注“GNRMC”信息。$GNRMC,121520.000,A,3438.1766,N,11224.5016,E,0.08,292.36,140816,A*77二、实例代码在LCD1602上显示经纬度。#includeREGX52.H#includestring.h#includestdio.h#includestdlib.h#includemath.h#includeLCD1602.h// 定义串口缓冲区大小根据实际GPS波特率/数据长度调整#defineGPRMC_BUF_SIZE80// 经纬度放大倍数用整数代替浮点如48.1173° → 481173避免浮点运算#defineLAT_LON_SCALE10000// 串口接收缓冲区相关#defineUART_BUF_SIZE100// 串口接收缓冲区大小可容纳完整GPRMC语句// 全局变量串口接收缓冲区中断中使用需全局unsignedcharuart_buf[UART_BUF_SIZE];// 存储接收到的串口数据unsignedintuart_buf_idx0;// 缓冲区索引bit gprmc_ready0;// GPRMC语句接收完成标志// GPRMC解析结果结构体typedefstruct{unsignedcharvalid;// 定位有效性1有效(A)0无效(V)unsignedcharutc_time[7];// UTC时间 hhmmss6位结束符unsignedcharutc_date[7];// UTC日期 ddmmyy6位结束符longlatitude;// 纬度十进制*10000如48.1173°→481173longlongitude;// 经度十进制*10000如11.5167°→115167unsignedcharlat_dir;// 纬度方向N/Sunsignedcharlon_dir;// 经度方向E/Wunsignedintspeed_knots;// 速度节放大10倍22.4→224unsignedintcourse;// 航向度放大10倍84.4→844}GPRMC_Data;// 全局/局部解析结果存储根据实际需求调整存储位置GPRMC_Data gprmc_data;// ------------------- 经纬度转字符串函数 -------------------/** * brief 将纬度转换为字符串如 481173 → 48.1173°N * param lat: 解析后的纬度整数放大10000倍 * param lat_dir: 纬度方向N/S * param str_buf: 输出字符串缓冲区至少12字节如-12.3456°S * retval 0:失败1:成功 */unsignedcharLat2Str(longlat,unsignedcharlat_dir,unsignedchar*str_buf){longabs_lat0;unsignedintint_part0;unsignedintdec_part0;if(str_bufNULL)return0;memset(str_buf,0,12);// 初始化缓冲区abs_latlat0?lat:-lat;// 取绝对值处理负数int_partabs_lat/LAT_LON_SCALE;// 整数部分481173→48dec_partabs_lat%LAT_LON_SCALE;// 小数部分481173→1173// 拼接字符串符号可选 整数.小数 ° 方向if(lat0){sprintf((char*)str_buf,-%d.%04d %c,int_part,dec_part,lat_dir);}else{sprintf((char*)str_buf,%d.%04d %c,int_part,dec_part,lat_dir);}return1;}/** * brief 将经度转换为字符串如 115167 → 11.5167°E * param lon: 解析后的经度整数放大10000倍 * param lon_dir: 经度方向E/W * param str_buf: 输出字符串缓冲区至少12字节 * retval 0:失败1:成功 */unsignedcharLon2Str(longlon,unsignedcharlon_dir,unsignedchar*str_buf){longabs_lon0;unsignedintint_part0;unsignedintdec_part0;if(str_bufNULL)return0;memset(str_buf,0,12);abs_lonlon0?lon:-lon;int_partabs_lon/LAT_LON_SCALE;dec_partabs_lon%LAT_LON_SCALE;if(lon0){sprintf((char*)str_buf,-%d.%04d %c,int_part,dec_part,lon_dir);}else{sprintf((char*)str_buf,%d.%04d %c,int_part,dec_part,lon_dir);}return1;}unsignedcharParseGPRMC(unsignedchar*gprmc_buf,GPRMC_Data*p_data){unsignedchar*ptrNULL;unsignedcharfield_idx0;// 字段索引对应GPRMC各字段unsignedcharfield_buf[20];// 单个字段缓冲区unsignedcharbuf_idx0;// 1. 基础校验非空、以$GPRMC开头if(gprmc_bufNULL||p_dataNULL)return0;if(strstr((char*)gprmc_buf,$GPRMC)NULL)return0;// 2. 初始化解析结果结构体memset(p_data,0,sizeof(GPRMC_Data));// 3. 按逗号分割字段核心解析逻辑ptrgprmc_buf;while(*ptr!\0field_idx12)// GPRMC共13个核心字段0-12{if(*ptr,||*ptr*)// 字段分隔符或校验和起始符{field_buf[buf_idx]\0;// 字段结束符buf_idx0;// 重置字段缓冲区索引// 4. 按字段索引解析对应数据switch(field_idx){case1:// UTC时间hhmmssif(strlen((char*)field_buf)6){strcpy((char*)p_data-utc_time,(char*)field_buf);}break;case2:// 状态A有效V无效if(field_buf[0]A){p_data-valid1;}elseif(field_buf[0]V){p_data-valid0;}else{return0;// 状态非法解析失败}break;case3:// 纬度ddmm.mmmmif(strlen((char*)field_buf)5){// 提取度前2位和分后几位转换为十进制整数unsignedintdegatoi((char*)field_buf);unsignedintminatoi((char*)field_buf2);floatlat_float(deg/100)(min%100(atof((char*)field_buf4))/10000)/60.0;p_data-latitude(long)(lat_float*LAT_LON_SCALE);}break;case4:// 纬度方向N/Sp_data-lat_dirfield_buf[0];if(p_data-lat_dirS){p_data-latitude-p_data-latitude;// 南半球取负}break;case5:// 经度dddmm.mmmmif(strlen((char*)field_buf)6){unsignedintdegatoi((char*)field_buf);unsignedintminatoi((char*)field_buf3);floatlon_float(deg/100)(min%100(atof((char*)field_buf5))/10000)/60.0;p_data-longitude(long)(lon_float*LAT_LON_SCALE);}break;case6:// 经度方向E/Wp_data-lon_dirfield_buf[0];if(p_data-lon_dirW){p_data-longitude-p_data-longitude;// 西半球取负}break;case7:// 速度节放大10倍存储22.4→224p_data-speed_knots(unsignedint)(atof((char*)field_buf)*10);break;case8:// 航向度放大10倍存储84.4→844p_data-course(unsignedint)(atof((char*)field_buf)*10);break;case9:// UTC日期ddmmyyif(strlen((char*)field_buf)6){strcpy((char*)p_data-utc_date,(char*)field_buf);}break;default:break;}field_idx;// 下一个字段if(*ptr*)break;// 校验和之后无有效字段退出循环}else{// 存储当前字符到字段缓冲区避免缓冲区溢出if(buf_idxsizeof(field_buf)-1){field_buf[buf_idx]*ptr;}}ptr;// 下一个字符}// 5. 最终校验必须包含有效状态和经纬度if(p_data-valid0||p_data-latitude0||p_data-longitude0){return0;}return1;// 解析成功}// ------------------- 串口初始化函数必须先初始化 -------------------voidUART_Init(void){TMOD|0x20;// 定时器1工作在模式28位自动重装TH10xFD;// 波特率9600晶振11.0592MHzTL10xFD;TR11;// 启动定时器1SCON0x50;// 串口工作在模式1允许接收REN1EA1;// 开启总中断ES1;// 开启串口中断}// ------------------- 串口接收中断服务函数核心 -------------------voidRECEIVE_DATA(void)interrupt4using3{unsignedcharrecv_char;// 接收的单个字符// 1. 清除中断标志必须否则会重复进入中断if(RI)// RI1表示串口接收到一个字符{RI0;// 清除接收中断标志recv_charSBUF;// 读取接收寄存器中的字符// 2. 数据缓存存储字符到缓冲区避免溢出if(uart_buf_idxUART_BUF_SIZE-1){// 关键GPRMC语句以换行符\n或\r结束以此判断接收完成if(recv_char\n||recv_char\r){uart_buf[uart_buf_idx]\0;// 字符串结束符// 判断是否是GPRMC语句以$GPRMC开头if(strstr((char*)uart_buf,$GPRMC)!NULL){gprmc_ready1;// 标记GPRMC语句接收完成}uart_buf_idx0;// 重置缓冲区准备接收下一条语句}else{uart_buf[uart_buf_idx]recv_char;// 存储字符}}else{// 缓冲区溢出重置避免数据错乱uart_buf_idx0;memset(uart_buf,0,UART_BUF_SIZE);}}}voidmain(){// 模拟GPS串口接收的GPRMC数据// unsigned char gprmc_test[] $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A;unsignedcharlat_str[12];// 纬度字符串缓冲区unsignedcharlon_str[12];// 经度字符串缓冲区LCD_Init();UART_Init();// 初始化串口必须先执行while(1){// 检测GPRMC语句是否接收完成if(gprmc_ready){gprmc_ready0;// 清除标志// 解析GPRMC数据if(ParseGPRMC(uart_buf,gprmc_data)){// 经纬度转字符串Lat2Str(gprmc_data.latitude,gprmc_data.lat_dir,lat_str);Lon2Str(gprmc_data.longitude,gprmc_data.lon_dir,lon_str);LCD_ShowString(1,0,lat_str);LCD_ShowString(2,0,lon_str);}}}}