GPS模块的应用

2023-05-16

文章目录

    • GPS模块的应用
      • 前言
      • 数据格式
      • 代码解析
        • 数据读取部分
        • 数据解析部分
        • 数据打印
        • 错误提示
        • 初始化部分
        • c内置函数的应用

GPS模块的应用

前言

ATGM336H-5N这个模块,主要是想在自己作的配送车上,增加GPS模块,好用来定位以及定点配送。然而实际效果,室内基本无信号,室外只能收到时间挫,具体待总结。

数据格式

GNGPBD分别代表 双模模式GPS 模式北斗模式
$表示一帧的开始

基本上提取的都是$GPRMC(最简定位信息)里面的数据

数据样式如下:

在这里插入图片描述

天线状态输出

$GPTXT,01,01,01,ANTENNA OK*35

Ok 代表天线已经检测到, open 代表天线断开

更多信息,可以参考模块配套资料

代码解析

主要分为4个部分

  • 数据读取
  • 数据解析
  • 数据打印,
  • 错误提醒

数据读取部分

首先,要确保连线无误,单片机能正常读取卫星信号

#define GpsSerial ss
#define DebugSerial Serial
#include <SoftwareSerial.h>
//RX和TX
SoftwareSerial ss(7, 8);
void setup(){
  GpsSerial.begin(9600);
  DebugSerial.begin(9600);

}
void loop(){
 while(GpsSerial.available()){
      byte gpsData = GpsSerial.read();
     DebugSerial.write(gpsData);
     }
}

之后构建结构体保存数据,并读取指定帧的数据!!

void gpsRead(){
    while(GpsSerial.available()){
//      byte gpsData = GpsSerial.read();
//      DebugSerial.write(gpsData);

      gpsRxBuffer[ii++] = GpsSerial.read();
      if(ii == gpsRxBufferLength) clrGpsRxBuffer();
 
      
    }
    //DebugSerial.write("test");
    char * GPS_BufferHead;
    char * GPS_BufferTail;
    if((GPS_BufferHead = strstr(gpsRxBuffer,"$GPRMC,")) !=NULL || (GPS_BufferHead = strstr(gpsRxBuffer,"$GNRMC,")) != NULL)
    { 
      if(((GPS_BufferTail = strstr(GPS_BufferHead,"\r\n")) !=NULL) && (GPS_BufferTail >GPS_BufferHead)){
        memcpy(save_data.GPS_Buffer,GPS_BufferHead,GPS_BufferTail-GPS_BufferHead);
        save_data.isGetData = true;
        clrGpsRxBuffer();
      }
    }
}
void clrGpsRxBuffer(){
   memset(gpsRxBuffer,0,gpsRxBufferLength);//清空
   ii = 0;
}

数据解析部分

剔除为空的数据,将有用的数据保存在结构体内

void paraGpsBuffer(){
  char *subString;
  char *subStringText;
  if(save_data.isGetData){
    save_data.isGetData = false;
    DebugSerial.println("********************");
    DebugSerial.println(save_data.GPS_Buffer);
    for (int i =0;i<=6;i++){
      if (i == 0){
        if((subString = strstr(save_data.GPS_Buffer,",")) == NULL)
        errorLog(1);
      }
      else{
        subString++;
        if((subStringText = strstr(subString,",")) != NULL)
        {
          char usefullBuffer[2];
          switch(i){
            case 1: memcpy(save_data.UTCTime,subString,subStringText-subString);
              break;//获取UTC时间
            case 2:memcpy(usefullBuffer,subString,subStringText-subString);
              break; //获取UTC时间
            case 3:memcpy(save_data.latitude,subString,subStringText-subString);
              break;//获取纬度信息
            case 4:memcpy(save_data.N_S,subString,subStringText-subString);
              break; //获取N/S
            case 5: memcpy(save_data.longitute,subString,subStringText-subString);
              break; //获取经度信息
            case 6:memcpy(save_data.E_W,subString,subStringText-subString);
              break;
            default:
              break;
          }
          subString = subStringText;
          save_data.isParaseData = true;
          if(usefullBuffer[0]=='A'){
            save_data.isUsefull = true;
          }
          else if(usefullBuffer[0]='V'){
            save_data.isUsefull =false;
          }
          else{
            errorLog(2); //解析错误
          }
        }
      }
    }
  }
}

数据打印

判断数据是否解析成功,之后在判断数据是否有用,之后再打印结构体的内容

void printGpsBuffer(){
  if(save_data.isParaseData){
    save_data.isParaseData = false;
    
    DebugSerial.print("save_data.UTCTime =");
    DebugSerial.println(save_data.UTCTime);
    if(save_data.isUsefull){
      DebugSerial.print("save_data.latitude = ");
      DebugSerial.println(save_data.latitude);
      DebugSerial.print("save_data.N_S=");
      DebugSerial.println(save_data.N_S);
      DebugSerial.print("save_data.longitute = ");
      DebugSerial.println(save_data.longitute);
      DebugSerial.print("save_data.E_W = ");
      DebugSerial.println(save_data.E_W);

    }
    else{
        DebugSerial.println("GPS DTAT is not usefull");
    }

  }
}

错误提示

出现错误时,13号灯会连续闪烁

void errorLog(int num){
  DebugSerial.print("ERROR");
  DebugSerial.println(num);
  while(1){
    digitalWrite(L,LOW);
    delay(300);
    digitalWrite(L,HIGH);
    delay(300);
  }
}

初始化部分

#define GpsSerial ss
#define DebugSerial Serial
#include <SoftwareSerial.h>
//结构体
 struct {
   char GPS_Buffer[80];
   bool isGetData;  //是否获得数据
   bool isParaseData;//是否解析完成
   char UTCTime[11]; //UTC时间
   char latitude[12];  //纬度
   char N_S[2];    //N/S
   char longitute[12]; //经度
   char E_W[2];  //E/W
   bool isUsefull; //定位信息是否有效
 }save_data;
 int L =13 ;
 const unsigned int gpsRxBufferLength = 600;
 char gpsRxBuffer[gpsRxBufferLength];
 unsigned int ii = 0;
// The serial connection to the GPS module
//RX和TX
SoftwareSerial ss(7, 8);
 int i = 0 ;

c内置函数的应用

  • char *strstr(const char *haystack, const char *needle);

    strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

  • void *memcpy(void *destin, void *source, unsigned n);

    函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中

  • void *memset(void *s, int ch, size_t n);
    将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GPS模块的应用 的相关文章

  • 如何检查Android GPS是否被禁用[重复]

    这个问题在这里已经有答案了 我有两个文件 MainActivity java 和 HomeFragment java MainActivity 中调用 HomeFragment 中的一个函数 要求用户打开手机上的位置服务 问题是 即使用户已
  • Geopy:计算 GPS 航向/方位

    第一次在这里发海报 我正在对桥梁检查 ROV 八旋翼收集的 GPS 数据进行一些数据分析 我们有八旋翼在运行ROS http 20www ros org wiki 使用 3D 扫描激光雷达 立体视觉 INS 和其他一些巧妙的技术 我目前正在
  • 当活动被破坏时,GPS图标不会消失吗?

    作为一个尝试 GPS 东西的 Android 新手 我设法将这段代码组合在一起 它的工作原理就像我期望的那样 除了一件事 GPS 图标永远不会消失 如何让GPS图标在Activity被破坏时消失 我有 locationManager rem
  • 我无法在 Android 真实手机上获取位置

    public class LocationService extends Service private Handler mHandler new Handler private Timer mTimer null private int
  • 将纬度和经度转换为十进制值

    我的 GPS 信息以以下形式呈现 北纬 36 57 9 西经 110 4 21 我可以使用Chris Veness 的 javascript 函数 http www movable type co uk scripts latlong ht
  • 如何在 python 中创建自己的数据类型以便覆盖算术运算符?

    我目前正在使用 Python Numpy 处理地理 GPS 数据 喜欢它 并且我面临着计算由坐标对定义的地理点之间的距离的重复任务pn lon lat 我有一个这样使用的函数 dist geodistance p1 p2 它类似于线性代数中
  • Android 手机和模拟器中的mapView不同

    关于应用程序 这是一个简单的应用程序 可以查找用户当前位置 问题 该应用程序在模拟器上运行良好 请参见图片 但在手机中它没有显示MapView 请看图片 请告诉我手机出了什么问题 在手机中 它只下载巨大的 20 MB 数据 但不显示实际地图
  • 如何在用户行走时跟踪 GPS 坐标,来自 iOS 平台的 xamarin.forms

    我刚刚经历过这个link http developer xamarin com recipes ios multitasking track significant location change 当用户使用 xamarin forms 应
  • 使用 Android.Xamarin 查找纬度和经度

    我正在尝试在 Android Xamarin 中开发商店定位器应用程序 我的第一步是找到我所在位置的纬度和经度 但我的模拟器 设备屏幕没有显示任何内容 我有我的uses permissions set to
  • 信号好的情况下GPS更新间隔越快?

    我试图限制我的程序每 10 秒更新一次位置 而不是不断更新 以减少电池消耗 当我在室内调试且信号较弱 即 GPS 图标闪烁 时 此方法工作正常 但如果手机得到正确修复 即 GPS 图标静态 更新间隔会增加到大约一秒 我知道代码mLocati
  • 如何测试GPS状态?

    我现在创建一个应用程序来通过 GPS 检测设备的位置 我对 GPS 状态有疑问 我查看 GpsStatus Listener 但它很复杂 因为我是 Android 新手 这是我尝试对 GPS 状态执行的操作 我是否走在正确的轨道上 fina
  • 如何在 Android 中找到附近的应用程序用户?

    我正在制作一个应用程序 需要能够找到附近的人 他们是我的应用程序的用户 我看了很多类似问题的答案 似乎我别无选择 只能不断将用户的当前位置上传到服务器 并在必要时获取附近的用户列表 那么我的问题是 1 要获取附近的列表 应该有一些计算距离的
  • 在带有校准点的地图上将经度和纬度转换为 X Y

    如果我有一张尺寸为 sizeX sizeY 的 jpeg 地图 以及地图上的一些校准点 X Y 经度 纬度 使用给定的经度 纬度对计算地图中相应 XY 点的算法是什么 这对我有用 没有那么多废话 int x int MAP WIDTH 36
  • 在设备所有者应用程序中启用 GPS

    根据API文档 https developer android com reference android app admin DevicePolicyManager html setSecureSetting android conten
  • 根据 GPS 坐标计算平均速度的最佳实践

    我这里有一个可以给我 GPS 坐标的设备 我可以定义的时间间隔 我想用它来计算驾驶或驾车旅行时的平均速度 实际上 我使用了正交公式来计算两点之间的距离 然后将其除以给定的时间间隔 通过我遵循的实施这个词 http de wikipedia
  • 寻找另一部智能手机的笛卡尔坐标?

    考虑到我有两部智能手机 A 和 B 如果我拿着智能手机 A 有没有办法确定 B 相对于我自己的位置 所以如果我们有这张图片的情况 它会告诉我 B 位于位置 2 1 利用 WiFi 信号强度来获取位置等创造性方法更受欢迎 我还可以确定两部手机
  • LocationManager requestLocationUpdates minTime OR minDistance

    我用的是安卓系统LocationManager及其方法requestLocationUpdates像这样 locationManager requestLocationUpdates LocationManager GPS PROVIDER
  • Android 中的 GPS 超时

    在黑莓中 我们使用超时来获取位置 这样如果它在这么长时间内没有重新调整位置 我们就会知道 但是在Android中 没有超时的概念 任何人都可以告诉我们替代方案 我们可以发现 在这么长时间之后 GPS没有位置更新 您可以使用两个线程来实现此超
  • 如何在 Android 中像 Google 地图一样获得持续的位置更新?

    我正在构建一个朋友跟踪 Android 应用程序 当我的朋友激活应用程序并带着他的 GPS 和蜂窝数据离开时 我需要在我的设备上跟踪他 这就是这个概念 我已经实现了 LocationListener 类 现在我可以从 Gps 或网络获取最后
  • iPhone 网络应用程序可以获取 GPS 位置吗?

    有没有一种简单的方法来设计一个网站来促进iphone用户提供gps网站坐标 我想知道表单字段是否有命名约定 例如 让用户以自动方式输入 我正在考虑建立一个基于位置的网站 并希望为 iPhone 和其他移动用户 量身定制 我意识到 iPhon

随机推荐