LuatOS
直播中

臣臣臣

4年用户 12经验值
擅长:嵌入式技术 制造/封装 控制/MCU 嵌入式技术 制造/封装 控制/MCU
私信 关注

【合宙Air551G双频定位开发板试用体验】实际应用性测试

赶紧趁时间还算充足来圆上一次测评中说的第二篇测评做实际功能应用,为了调试方便,调试中采用STM32f103做接收端,并将所获得的经纬度坐标经过计算放到屏幕上,首先,惯例接一下ttl模块监测一下是否可以正确定位,采用上篇测评报告中所用的正点原子软件xcom,获得定位信息。
1.jpg
发现没问题可以正常搜星,之后进行程序设计,旨在对GNRMC代码进行解析,已知经纬度的计算方法,这里给出stm32所使用的解析代码。
  1. void NMEA_GNRMC_Analysis(nmea_msg *gpsx,u8 *buf)
  2. {
  3.         u8 *p1,dx;                         
  4.         u8 posx;     
  5.         u32 temp;          
  6.         float rs;  
  7.         p1=(u8*)strstr((const char *)buf,"$GNRMC");
  8.         posx=NMEA_Comma_Pos(p1,1); //得到UTC时间
  9.         if(posx!=0XFF)
  10.         {
  11.                 temp=NMEA_Str2num(p1+posx,&dx)/NMEA_Pow(10,dx); //得到UTC时间,去掉ms
  12.                 gpsx->utc.hour=temp/10000;
  13.                 gpsx->utc.min=(temp/100)%100;
  14.                 gpsx->utc.sec=temp%100;                  
  15.         }       
  16.         posx=NMEA_Comma_Pos(p1,3); //得到纬度
  17.         if(posx!=0XFF)
  18.         {
  19.                 temp=NMEA_Str2num(p1+posx,&dx);                          
  20.                 gpsx->latitude=temp/NMEA_Pow(10,dx+2);        //得到°
  21.                 rs=temp%NMEA_Pow(10,dx+2);                                //得到'                 
  22.                 gpsx->latitude=gpsx->latitude*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx))/60;//转换为°
  23.         }
  24.         posx=NMEA_Comma_Pos(p1,4); //南纬还是北纬
  25.         if(posx!=0XFF)gpsx->nshemi=*(p1+posx);                                         
  26.         posx=NMEA_Comma_Pos(p1,5); //得到经度
  27.         if(posx!=0XFF)
  28.         {                                                                                                  
  29.                 temp=NMEA_Str2num(p1+posx,&dx);                          
  30.                 gpsx->longitude=temp/NMEA_Pow(10,dx+2);        //得到°
  31.                 rs=temp%NMEA_Pow(10,dx+2);                                //得到'                 
  32.                 gpsx->longitude=gpsx->longitude*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx))/60;//转换为°
  33.         }
  34.         posx=NMEA_Comma_Pos(p1,6); //东经还是西经
  35.         if(posx!=0XFF)gpsx->ewhemi=*(p1+posx);                 
  36.         posx=NMEA_Comma_Pos(p1,9); //得到UTC日期
  37.         if(posx!=0XFF)
  38.         {
  39.                 temp=NMEA_Str2num(p1+posx,&dx); //得到UTC日期
  40.                 gpsx->utc.date=temp/10000;
  41.                 gpsx->utc.month=(temp/100)%100;
  42.                 gpsx->utc.year=2000+temp%100;                  
  43.         }
  44. }
在简单配置一下屏幕和uart的初始化,编译并烧录,上外面看看效果,可以看见经纬度坐标已经显示在屏幕上了
2.png
另一个问题,如果可以用gps来求出速度值,就能有好多新点子,又认真看了一遍GNRMC的解析,参考https://www.cnblogs.com/88223100/p/GPRM_GNRMC_Transform.html
格 式:
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh
$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
说 明:
字段 0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息
         字段 1:UTC时间,hhmmss.sss格式
         字段 2:状态,A=定位,V=未定位
         字段 3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
         字段 4:纬度N(北纬)或S(南纬)
         字段 5:经度dddmm.mmmm,度分格式(前导位数不足则补0)
         字段 6:经度E(东经)或W(西经)
         字段 7:速度,节,Knots(一节也是1.852千米/小时)
         字段 8:方位角,度(二维方向指向,相当于二维罗盘)
         字段 9:UTC日期,DDMMYY格式
         字段10:磁偏角,(000 - 180)度(前导位数不足则补0)
         字段11:磁偏角方向,E=东,W=西
         字段12:模式,A=自动,D=差分,E=估测,N=数据无效(3.0协议内容)
         字段13:校验值

原来字段7所代表的信息就是速度值,赶紧出去跑两步,通过串口收到的数据发现,确实在字段7的位置出现了速度信息 3.jpg

单位为节,换算一下2.99km/h确实是人正常的步行速度,和上面解析的代码相似,加一条而已,这里就不列出来了。之后换上实际项目中使用的设备,先与车机中的定位做一个比较,可以看到,定位精度甚至比车机的要好。 4.png 5.png

再从屏幕上查看gps传回的速度值,利用该速度值,可以和识别出的限速标志进行比对,在不接入汽车obd的情况下得到相对准确的速度值,判断是否超速并对驾驶员进行语音提醒。
6.png

至此,已经将合宙air551g开发板用于实际项目以完成并达到了不错的预期效果,再次感谢合宙和发烧友平台。

更多回帖

发帖
×
20
完善资料,
赚取积分