安信可A7编程获取GPS信息

2024-01-25 16:10
文章标签 编程 获取 信息 a7 gps 安信

本文主要是介绍安信可A7编程获取GPS信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

曲终人散空愁暮,招屈亭前水车注。——刘禹锡《竞渡曲》

前面两篇文章已经描述了串口编程以及在串口调试助手下对GPS信息的解析。这篇文章主要讲怎么样在板子上通过编程来获取GPS信息。

前两篇文章地址:
串口编程:http://blog.csdn.net/peter_tang6/article/details/72790169
GPS信息解析:http://blog.csdn.net/peter_tang6/article/details/72146764

我们这个程序分三步走:
1、设置串口
2、获取GPS信息
3、提取出来

设置串口

我的串口用的是/dev/ttyUSB0,具体的串口设置程序在上一篇文章已经详细介绍过,本篇不再赘述。
这里我们使用命令先来监听我们的串口,当然,前提是我们的串口已经能使用,并且我们已经连接好模块,模块的连接方式前面已经说过http://blog.csdn.net/peter_tang6/article/details/72146764。

使用microcom命令监听GPS(GPS的波特率为9600)

这里写图片描述

获取GPS数据信息

/*********************************************************************************
    *      Copyright:  (C) 2017 tangyanjun<519656780@qq.com>
    *                  All rights reserved.
    *
    *       Filename:  test.c
    *    Description:  This file 
    *                 
    *        Version:  1.0.0(05/28/2017)
    *         Author:  tangyanjun <519656780@qq.com>*      ChangeLog:  1, Release initial version on "05/28/2017 11:58:17 AM"*                 ********************************************************************************/#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <stdlib.h>#include "gps.h"#define GPS_LEN 512 int gps_analysis(char *buff,GPRMC *gps_date);
int print_gps(GPRMC *gps_date);
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop);/*********************************************************************************  Description:   main():程序执行的入口*   Input Args:    *  Output Args:* Return Value:********************************************************************************/
int main (int argc, char **argv)
{
     int fd = 0;
     int nread = 0;     GPRMC gprmc;     char gps_buff[GPS_LEN];
     char *dev_name = "/dev/ttyUSB0";     fd = open(dev_name, O_RDWR | O_NOCTTY | O_NDELAY);
     if(fd < 0)
     {
         printf("open ttyS1 error!!\n");
         return -1;
     }     set_opt( fd, 9600, 8, 'N', 1);     while(1)
     {
         sleep(2);
         nread = read(fd, gps_buff, sizeof(gps_buff));
         if(nread < 0)
         {
             printf("read GPS date error!!\n");
             return -2;
         }
         printf("gps_buff: %s\n", gps_buff);         memset(&gprmc, 0 , sizeof(gprmc));
         gps_analysis(gps_buff, &gprmc);         print_gps(&gprmc);
     }    close(fd);
    return 0;
} /* ----- End of main() ----- */

附上头文件:

/**********************************************************************************      Copyright:  (C) 2017 tangyanjun<519656780@qq.com>*                  All rights reserved.**       Filename:  gps.h*    Description:  This file *                 *        Version:  1.0.0(05/28/2017)*         Author:  tangyanjun <519656780@qq.com>*      ChangeLog:  1, Release initial version on "05/28/2017 12:29:30 PM"*                 ********************************************************************************/#ifndef __GPS_H__#define __GPS_H__typedef unsigned int UINT;typedef int BYTE;typedef long int WORD;typedef struct __gprmc__{UINT time;                  //格林威治时间char pos_state;             //定位状态float latitude;             //纬度float longitude;            //经度float speed;                //移动速度float direction;            //方向UINT date;                  //日期float declination;          //磁偏角char dd;                    //磁偏角方向char mode;}GPRMC;extern int gps_analysis(char *buff, GPRMC *gps_date);extern int print_gps(GPRMC *gps_date);extern int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop);#endif

提取GPS数据信息

/*********************************************************************************
    *      Copyright:  (C) 2017 tangyanjun<519656780@qq.com>
    *                  All rights reserved.
    *
    *       Filename:  analyze.c
    *    Description:  This file 
    *                 
    *        Version:  1.0.0(05/28/2017)
    *         Author:  tangyanjun <519656780@qq.com>*      ChangeLog:  1, Release initial version on "05/28/2017 12:33:11 PM"*                 ********************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>#include "gps.h"/***************************************************************************************  Description:从GPS数据包中抽取出GPRMC最小定位信息*   Input Args:buff:GPS返回的数据包 gps_date:GPRMC信息存储结构体*  Output Args:* Return Value:*************************************************************************************/
int gps_analysis(char *buff,GPRMC *gps_date)
{
    char *ptr=NULL;    if(gps_date==NULL)
      return -1;    if(strlen(buff)<10)
      return -1;    if(NULL==(ptr=strstr(buff,"$GPRMC")))
     return -1;    sscanf(ptr,"$GPRMC,%d.000,%c,%f,N,%f,E,%f,%f,%d,,,%c*",&(gps_date->time),&(gps_date->pos_state),&(gps_date->latitude),&(gps_date->longitude),&(gps_date->speed),&(gps_date->direction),&(gps_date->date),&(gps_date->mode));return 0;
} /* ----- End of if()  ----- *//********************************************************************************************strstr(str1,str2) 函数用于在字符串str1中搜寻str2,并返回str2在str1中首次出现的地址;否则,返回NULL
sscanf()格式化字符串输入,从一个字符串中读进与指定格式相符的数据并在存入到另一个字符串中**********************************************************************************************//***************************************************************************************  Description:解析GPRMC最小定位信息,并打印到屏幕上*   Input Args:gps_date:gps_analysis函数抽取的GPRMC信息*  Output Args:* Return Value:*************************************************************************************/
int print_gps(GPRMC *gps_date)
{
    printf("                                                           \n");
    printf("                                                           \n");
    printf("===========================================================\n");
    printf("==                   全球GPS定位导航模块                 ==\n");
    printf("==              开发人员:唐延军                           ==\n");
    printf("==              邮箱:519656780@qq.com                  ==\n");
    printf("==              平台:fl2440                             ==\n");
    printf("==              GPS型号:FIT-GPS_SF2820(代替ET-312)    ==\n");
    printf("===========================================================\n");
    printf("                                                         \n");
    printf("                                                         \n");
    printf("===========================================================\n");
    printf("==                                                       \n");
    printf("==   GPS状态位 : %c  [A:有效状态 V:无效状态]             \n",gps_date->pos_state);
    printf("==   GPS模式位 : %c  [A:自主定位 D:差分定位]             \n", gps_date->mode);
    printf("==   日期 : 20%02d-%02d-%02d                             \n",gps_date->date%100,(gps_date->date%10000)/100,gps_date->date/10000);
    printf("==   时间 : %02d:%02d:%02d                               \n",(gps_date->time/10000+8)%24,(gps_date->time%10000)/100,gps_date->time%100);
    printf("==   纬度 : 北纬:%d度%d分%d秒                                    \n", ((int)gps_date->latitude) / 100, (int)(gps_date->latitude - ((int)gps_date->latitude / 100 * 100)), (int)(((gps_date->latitude - ((int)gps_date->latitude / 100 * 100)) - ((int)gps_date->latitude - ((int)gps_date->latitude / 100 * 100))) * 60.0));
    printf("==   经度 : 东经:%d度%d分%d秒                                    \n", ((int)gps_date->longitude) / 100, (int)(gps_date->longitude - ((int)gps_date->longitude / 100 * 100)), (int)(((gps_date->longitude - ((int)gps_date->longitude / 100 * 100)) - ((int)gps_date->longitude - ((int)gps_date->longitude / 100 * 100))) * 60.0));
    printf("==   速度 : %.3f                                         \n",gps_date->speed);
    printf("==                                                       \n");
    printf("===========================================================\n");
    return 0;
} /* ----- End of print_gps()  ----- */

1、我们的时间是格林威治时间,即世界时间(UTC),我们需要把它转换成北京时间,加上8个小时即可。
2、定位状态为V的时候才是有效的数据。
3、经纬度的转换:我们把它转化成度分秒格式

我们收到的是4546.40891
然后4546.40891 / 100 = 45.4640891 则读出45度
然后4546.40891 - 45 * 100 = 46.40891 则读出46分
最后46.40891 - 46 = 0.40891 * 60 = 24.5346 读出24秒
因此最后结果是:45度46分24秒。

然后我通过强制类型转换将这个计算过程用一个表达式表示出来,即上面程序中的经度和纬度的结果。

最后将前面的串口程序和这三个程序放在同一文件夹下,再附上Makefile文件:

CC =/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
objs   =  serial.o analyze.o test.o
srcs   =  serial.c analyze.c test.cgps: $(objs)$(CC) -o gps $(objs)@make cleantest.o: $(srcs) gps.h$(CC) -c $(srcs)serial.o: serial.c$(CC) -c serial.canalyze.o: analyze.c gps.h$(CC) -c analyze.cclear:@rm  gps.PHONY: clean
clean:@rm *.o

make之后生成gps文件,传到开发板中,给其可执行权限,运行:
这里写图片描述

程序代码就不一一分析了,这里理清一下代码实现的基本流程:

首先打开我们的设备,即串口
设置我们的串口
将串口输出的内容放到一个buf中
利用strstr和sscanf函数将我们buf中的$GPRMC这一行内容提取出来,并用sscanf函数将其内容与头文件中定义的结构体信息(即这一行信息的内容)一一配对。
sscanf()格式化字符串输入,从一个字符串中读进与指定格式相符的数据并在存入到另一个字符串中;strstr(str1,str2) 函数用于在字符串str1中搜寻str2,并返回str2在str1中首次出现的地址;否则,返回NULL。
最后打印我们的信息。

这段程序主要是针对我们对数据的提取以及对数据的处理能力。

这篇关于安信可A7编程获取GPS信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/643812

相关文章

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

Java并发编程之——BlockingQueue(队列)

一、什么是BlockingQueue BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种: 1. 当队列满了的时候进行入队列操作2. 当队列空了的时候进行出队列操作123 因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作;同样,当一个线程试图对一个空