基于Arduino的GPS数据解析程序

2023-05-16

这篇博客讲了我利用arduino来解析和转发原始nema 0813数据的思想和实现方法。因为arduino比较简单,无法实现串口数据接收中断,所以都写在主循环里面了。不知道代码存在何种缺陷和漏洞,欢迎大家批评指正。

GPS软件要求

·         Ardiuno软件

·         监控串口1,接收数据。

·         数据格式:NEMA0813

·         解析出经纬度原始格式,xxxx.xxxxx, xxxx.xxxxx,保存,解析出短格式,2B 经度,2B 维度,保存

·         短格式:经纬度都是0.0ABCD格式小数最末4位,例如信号中经度是1234.56789,则得到67 和 89

·         经纬度都正常则LED亮。

·         串口2收到AddressWHR的时候:

·         经纬度按原始格式向串口2发送,以AddressFLT开头,跟着固定格式经纬度xxxx.xxxxx,xxxx.xxxxx,CRC结尾

·         经纬度按短格式向串口2发送:{ AddressLCT,2B 经度,2B 维度,1B CRC}

/***
 * The circuit:
 * RX is digital pin 10 (connect to TX of other device)
 * TX is digital pin 11 (connect to RX of other device)
***/
#include 
 
SoftwareSerial mySerial(10, 11);
 
char rmc_flag = 0;
char command_flag = 0;
 
char gps_data_nema[220] = {0};
char gps_data_rmc[72] = {0};
char gps_data_anal[20] = {'0','0','0','0','0','.','0','0','0','0',
                        '0','0','0','0','0','.','0','0','0','0'};//经纬度分
char gps_data_byte[4] = {0};
 
char *gprmc = "$GPRMC";
char *command = "Ad";
char command_code[2] = {0};
 
void memcpy(char *dest, char *src, int n)
{
  int i = 0;
  for(i = 0; i < n; i++)
  {
    *dest = *src;
    dest++;
    src++;
  }
}
 
int memcmp(char *s1, char *s2, int n)
{
  int i = 0;
  for(i = 0; i < n; i++)
  {
    if(*s1 != *s2)return 0;
    s1++;
    s2++;
  }
  return 1;
}
 
void setup() 
{
  Serial.begin(57600);
  mySerial.begin(4800);
}
 
void loop() {
  static char i = 0;
  static char j = 0;
  char k = 0;
  char l = 0;
  char comma[12] = {0}; //一共有12个逗号
  // put your main code here, to run repeatedly:
  if(Serial.available())
  {
    gps_data_nema[i] = Serial.read();
    Serial.print(gps_data_nema[i]);
 
	if(i == 0)
	{
	    if(gps_data_nema[i] != ' 


---------------------
作者:AllenSun-1990
来源:CSDN
原文:https://blog.csdn.net/xikangsoon/article/details/72860080
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件) Serial.println("Warning:the data input is wrong!"); } if(gps_data_nema[i] == '


---------------------
作者:AllenSun-1990
来源:CSDN
原文:https://blog.csdn.net/xikangsoon/article/details/72860080
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件) { i = 0; gps_data_nema[i] = '


---------------------
作者:AllenSun-1990
来源:CSDN
原文:https://blog.csdn.net/xikangsoon/article/details/72860080
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件; } if(gps_data_nema[i] == 0x0A) //if the end of string { if(memcmp(gps_data_nema, gprmc, 6)) { memcpy(gps_data_rmc, gps_data_nema, i); rmc_flag = 1; }; i = 0; } if(i > 210) //if the data is out range Serial.println("Warning:the data formation is false!"); i++; } if(rmc_flag == 1) { l = 0; for(k = 0; k < 72; k++) { if(gps_data_rmc[k] == ',') { comma[l] = k; l ++; } } if((comma[3]-comma[2]) == 10) { k = comma[2] + 1; memcpy(&gps_data_anal[11], &gps_data_rmc[k], 9); } if((comma[5]-comma[4]) == 11) { l = comma[4] + 1; memcpy(&gps_data_anal[0], &gps_data_rmc[l], 10); } gps_data_byte[0] = gps_data_anal[8]; gps_data_byte[1] = gps_data_anal[9]; gps_data_byte[2] = gps_data_anal[18]; gps_data_byte[3] = gps_data_anal[19]; rmc_flag = 0; } if(mySerial.available()&&(command_flag == 0)) { command_code[j] = mySerial.read(); mySerial.print(command_code[j]); j = j + 1; if(j == 2) { mySerial.print("AddressWHR"); command_flag = 1; j = 0; } } if(command_flag == 1) { if(memcmp(command, command_code, 2)) { mySerial.print("AddressFLT"); for(k = 0; k < 20; k++)mySerial.print(gps_data_anal[k]); mySerial.print("CRC"); mySerial.print("AddressLCT"); for(l = 0; l < 4; l++)mySerial.print(gps_data_byte[l]); mySerial.print("CRC"); } command_flag = 0; } }


---------------------
作者:AllenSun-1990
来源:CSDN
原文:https://blog.csdn.net/xikangsoon/article/details/72860080
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

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

基于Arduino的GPS数据解析程序 的相关文章

  • 是否有通用 I2C 命令来查看设备是否仍然存在于总线上?

    是否有通用的 I2C 命令来查看设备在初始化一次后是否仍然存在于总线上 例如 OLED 显示器 我问这个的原因是为了避免主程序由于库代码中存在无限循环而冻结 当设备断开连接时 例如 Wire 库 在 MCU 启动时 我想检查设备是否可用 并
  • 如何确定当前用户位置是否在我的 MKCooperativeRegion 内?

    我有一个坐标区域 我已确定该区域包含我想要为我的应用程序显示的内容的限制 我已将其设置为具有中心点纬度 经度和跨度的 MKCooperativeRegion 如何确定当前 userLocation 是否在我的坐标区域内 使用地图矩形 这是使
  • Java中的多点三边测量算法

    我正在尝试在我的 Android 应用程序中实现三边测量算法来确定用户的室内位置 我正在使用超宽带信标来获取到固定点的距离 我能够采用中建议的方法三边测量法 Android Java https stackoverflow com ques
  • 设置模拟位置时 GPS 提供商未知错误?

    我正在尝试设置我的模拟位置 但是 我收到以下错误 提供商 gps 未知 并且不确定出了什么问题 我已经获得了在manifest xml 中声明的所有权限以及所有参数 模拟定位法 Initiates the method to set the
  • 使用 Java 控制 Arduino

    我正在寻找一个LED http en wikipedia org wiki Light emitting diode用Java程序打开和关闭 我用 C 完成了这个项目大约 5 分钟 但用 Java 似乎更具挑战性 我让 Arduino 等待
  • 在不改变我的位置的情况下获取当前位置的经度和纬度

    我可以找到当前位置的纬度和经度 但是这些数据在更改我的当前位置之前不会显示 我想在不更改我的位置的情况下获取当前位置的经度和纬度 package com example gps import android app Activity imp
  • 如何将timestamp_t转换为实际时间?

    我见过很多使用 time t 的例子 但 timestamp t 让我感到困惑 我正在做一个作业 我们需要打印出 GPS 数据 并且 GPS 设备返回一个类型 timestamp t 来表示它的时间戳和纪元时间 我尝试过使用 gmtime
  • 在 Arduino 上将整数/小数转换为十六进制?

    如何将整数或小数变量转换为十六进制字符串 我可以做相反的事情 将十六进制转换为整数 但我无法找出其他方法 这是为了Serial print 数组中的十六进制值 查看 Arduino 字符串教程here http arduino cc en
  • GPS 坐标(以度为单位)来计算距离

    在iPhone上 我以十进制度数获取用户的位置 例如 纬度39 470920和经度 0 373192 也就是A点 我需要用另一个 GPS 坐标 同样以十进制表示 B 点创建一条线 然后 计算从 A 到 B 的线与另一个点 C 之间的距离 垂
  • 是否可以在 Arduino 上运行 ZeroMQ

    我想知道是否可以通过 ZeroMQ 与 Arduino 进行通信 我想使用 Arduino 来控制一些设备 并希望将大部分应用程序放在计算机上 为此 如果 Arduino 和控制器可以通过 Zeromq 以及 WiFi 或以太网扩展板进行通
  • Android:计算两个位置之间距离的最佳方法

    我在这个主题上做了一些研究 但有很多观点并没有给出一个清晰的图像 我的问题是这样的 我正在为 Android 开发一个基于 GPS 的应用程序 在其中我想实时了解 Android LocationManager 指定的当前位置与其他位置之间
  • 在声明对象之前在全局函数中使用类的成员函数

    我有一个事件处理函数 在该函数中调用了类的成员函数 事件处理函数在类 cpp 文件中声明 但不是类的一部分 它不是成员函数 当我编译代码时 编译器表示该函数在范围内 因为它正在调用全局事件处理函数中的成员函数 我的问题如下 有没有办法在全局
  • LocationManager requestLocationUpdates minTime OR minDistance

    我用的是安卓系统LocationManager及其方法requestLocationUpdates像这样 locationManager requestLocationUpdates LocationManager GPS PROVIDER
  • Android 查找 GPS 位置一次,显示加载对话框

    我正在编写一个应用程序 它需要用户的当前位置 lastknownlocation 不会很有帮助 并显示从数据库中获取的所有最接近的 项目 的列表 我已经找到了最近的项目 效果很好 但暂时只使用硬编码的纬度和经度位置 但现在是时候实现查找实际
  • 通过iPhone音频插孔读取数据

    我正在寻找一种方法来读取通过 iPhone 的音频插孔从 Arduino 发送的原始数据 我搜索了很多并发现this https github com sanjibahmad Is Headphone Plugged In tree mas
  • 当我的活动结束时,如何停止 GPS/位置跟踪?

    我有一个非常简单的 Android 应用程序 它显示 Google 地图视图并使用 GPS 跟踪位置 基本上像这样 public void onCreate Bundle savedInstanceState mLocationManage
  • Arduino串口数据解析

    我正在编写一个应用程序 通过蓝牙用我的 Android 手机控制我的机器人 一切都很顺利 数据得到回显和验证 但我在协议方面遇到了一些问题 特别是我希望我的机器人的轮子在我发送时转动一个命令 例如s 10 100 or s 30 10 数值
  • 检测wifi是否启用(无论是否连接)

    对于 GPS 跟踪应用程序来说 在打开 WIFI 的情况下记录位置信号会导致数据非常不精确或存在间隙 在开始跟踪之前 我已使用可达性查询来检测 wifi 是否可用 问题是 如果进行该查询时 wifi 已启用但未连接到网络 则表明无法通过 w
  • 向 tk103 GPS 跟踪器发送命令

    我正在使用 php 开发实时 GPS 跟踪器 Web 应用程序 跟踪器参考号是tk103 我可以从跟踪器接收信息并将其存储到数据库中 设备的 GPRS 模式已启用 我的问题是 如何使用 php ini 将命令从服务器发送到设备 提前致谢 这
  • 关闭应用程序后如何调试

    我正在尝试重现问题 这需要在特定位置关闭并重新打开我的应用程序 这是我的问题 1 如何查看我的日志 使用NSLog命令 当我的 iPhone 未连接到 XCode 时 2 是否可以将iPhone模拟器的特定位置 例如市中心 设置为默认位置

随机推荐

  • GTK+2.0之初始学习篇(二)—— g_signal_connect宏解释及HelloWorld

    GTK 43 2 0中利用信号 回调函数机制来处理窗口外部传来的事件 消息或信号 以下实现的是单击窗口关闭按钮 xff0c 窗口自动关闭 在程序中调用了gtk main quit 函数实现退出主循环 include lt gtk gtk h
  • linux-----页、页表、页框(块)

    基本介绍 我们知道 xff0c 在linux操作系统中 xff0c CPU在执行一个进程的时候 xff0c 都会访问内存 但CPU并不是直接访问物理内存地址 xff0c 而是通过虚拟地址空间来间接的访问物理内存地址 所谓的虚拟地址空间 xf
  • CMake交叉编译配置

    罗列一下cmake常用的命令 CMake支持大写 小写 混合大小写的命令 1 添加头文件目录INCLUDE DIRECTORIES 语法 xff1a include directories AFTER BEFORE SYSTEM dir1
  • 8086CPU的14个寄存器全称

    通用寄存器 xff1a ax accumulate register 累加器 bx based register 基地址寄存器 cx count register 计数器 dx data registered 数据寄存器 段寄存器 xff1
  • 项目开发-后台管理框架

    开发中几乎的平台都需要一个后台管理 xff0c 但是从零开发一套后台控制面板并不容易 xff0c 幸运的是有很多开源免费的后台控制面板可以给开发者使用 xff0c 那么有哪些优秀的开源免费的控制面板呢 xff1f 我在 Github 上收集
  • 项目经理必备工具-个人推荐

    点击链接 项目经理必备工具 进入详细说明
  • 如何绕过CDN找源站ip?

    如何绕过CDN找源站ip xff1f 这是一个总结帖 xff0c 查了一下关于这个问题的国内外大大小小的网站 xff0c 对其中说的一些方法总结归纳形成 xff0c 里面具体发现ip的方法不是原创 xff0c 所有参考的原贴都也贴在了后面
  • Navicat修改MySQL数据库密码就是这么简单

    方法1 xff1a 用SET PASSWORD命令 首先登录MySQL 格式 xff1a mysql gt set password for 用户名 64 localhost 61 password 39 新密码 39 例子 xff1a m
  • Axure 元件库-原型

    元件名称 xff1a 1 Axure交互原型设计指南 rp 2 PC和移动原型常用元件 rp 3 后台模板 rp 4 全局说明 rp https pan baidu com s 1vmac 08MZAKj6qsdjwIZlg 提取码 xff
  • Node.js 通过http调用外部接口

    通过http request发送带参数的post请求 data xff1a 发送的内容 opt xff1a 描述将要发出的请求 data xff1a 事件在数据到达时被触发 end xff1a 请求结束时触发 error xff1a 发生错
  • 想成为出色的 CTO,你要具备这七大能力

    编者按 xff1a 首席技术官这一职位在20世纪80年代出现于美国 起于做很多技术研发的大公司 xff0c 如General Electric 主要职能是将科研成果转化实际效益 简单地说 xff0c 就是一个企业中技术的最高负责人 要扮演好
  • Keil中添加自己的头文件

    xfeff xfeff 方法一 在keil的开发环境下添加 xff1a 请注意上面的系统生成的头文件目录是 xff1a xff0c 即 dd jj pp kk xff0c 其中 是相对于项目文件 uvproj 而言的 其中 表示项目文件所在
  • http authorization 基本认证

    最近做的一个项目需要与其它系统对接接口 xff0c 对方提供的是webservice的接口 xff0c 并且需要Basic Authorization基本认证 xff0c 一开始都是用postman请求 xff0c 用户名和密码需要填在Ba
  • 终端命令安装 chrome for linux

    终端里安装chrome for linux 备注 xff1a 我是在Linux Mint 17 1 64位系统下安装的chrome for linux xff0c 其它Debian衍生版应该也是一样的 1 在终端里输入下载命令 xff1a
  • Arduino串口函数详解

    本文总结了Arduino常用串口操作函数 xff0c 函数说明部分来源于Arduino 官网串口使用指南 xff0c 示例与实验部分为自编 本文是对Arduino串口操作函数的较全面总结 xff0c 可作为工具贴查找使用 1 串口设置 xf
  • STM32CubeMX——霍尔编码器、L298N驱动电机

    前言 人生如逆旅 xff0c 我亦是行人 苏轼 临江仙 送钱穆父 目录 xff1a L298N电机驱动介绍编码器介绍电机介绍新建工程编写代码实验结果 一 L298N电机驱动介绍 B站 视频讲解 xff1a l298n电机驱动模块 电机正反转
  • AT命令拨电话,如何判断手机的状态?

    我使用AT命令拨电话 xff0c 如 xff1a ATD10086 我怎么知道我拨打的电话是否成功了呢 xff1f 比如SIM卡欠费了 xff0c 那么肯定算是没有拨通 xff1b 再比如网络有问题 xff0c 被叫方没有收到来电 xff0
  • GPS模块(GPS-NEO-6M)

    ATK NEO 6M GPS 模块简介 ATK NEO 6M V23 模块 xff0c 是 ALIENTEK 生产的一款高性能 GPS 模块 xff0c 模块核心采用 UBLOX公司的 NEO 6M 模组 xff0c 具有 50 个 通道
  • toCharArray()

    toCharArray 是将一个字符串内容转换为字符数组 xff0c 例如 String str 61 34 abc 34 System out println str toCharArray 43 34 34 将输出a b c 转载于 h
  • 基于Arduino的GPS数据解析程序

    这篇博客讲了我利用arduino来解析和转发原始nema 0813数据的思想和实现方法 因为arduino比较简单 xff0c 无法实现串口数据接收中断 xff0c 所以都写在主循环里面了 不知道代码存在何种缺陷和漏洞 xff0c 欢迎大家