基于Arduino的GPS数据解析程序

这篇博客讲了我利用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博客文章一键转载插件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值