上一篇博文整理学习了有关串口通信、串口编程的一些基本知识。本篇将通过编程来获取、解析、转换GPS接收机接收的信息。
我们将在fl2440开发板上实现该功能。

一、A7与开发板连线

我使用的是USB转TTL串口转接线,这里要保证Linux支持了所用的转接芯片。我使用的是cp210的USB转串口芯片,因此要在内核选项中支持它:

make menuconfigDevice Drivers->[*]USB support ->[*]USB Serial Converter supportUSB CP210x family of UART Bridge Controllers 

make新内核烧录到开发板,这样开发板就使能了USB驱动。
将串口AT指令控制发送端(U_TXD)和串口AT指令控制接收端(U_RXD)分别与USB转TTL转接头上的RXD和TXD相连,GND与GND相连。另一端接入开发板的USB口即可。

二、打开GPS功能并测试

将A7连上开发板以后,在开发板上使用microcom命令监听相关串口,USB转串口芯片连接则监听串口/dev/ttyUSB0。然后把GPS功能打开:

>: microcom -s 115200 /dev/ttyUSB0
>at   //检测模块是否正常
OK
>AT+GPS=1   //打开GPS功能
OK

此时将A7模块上的U_TXD连线切换到A7模块上的GPS_TXD引脚,其他连线不变。以波特率为9600重新打开监听串口,将会不断的收到GPS定位的数据。

可以看到GPS已经正常工作。

三、编程实现信息获取、解析

首先便是对串口的设置程序s_uart.c。通过串口把数据发送到终端设备,请参考上一篇博文

gps数据分析,gps_analyse.c :

/*********************************************************************************
*      Copyright:  (C) 2017 TangBin<tangbinmvp@gmail.com>
*                  All rights reserved.
*
*        Filename:  gps_analyse.c
*    Description:  This file
*
*           Version:  1.0.0(06/04/2017)
*            Author:  TangBin <tangbinmvp@gmail.com>
*     ChangeLog:  1, Release initial version on "06/04/2017 07:59:41 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"int gps_analyse (char *buff,GPRMC *gps_data)
{char *ptr = NULL;if(gps_data==NULL){return -1;}if(strlen(buff)<10){return -1;}/*如果buff字符串中包含字符"$GPRMC"则将$GPRMC的地址赋值给ptr*/if(NULL==(ptr=strstr(buff,"$GPRMC"))){return -1;}sscanf(ptr,"$GPRMC,%d.000,%c,%f,N,%f,E,%f,%f,%d,,,%c*",&(gps_data->time),&(gps_data->pos_state),&(gps_data->latitude),&(gps_data->longitude),&(gps_data->speed),&(gps_data->direction),&(gps_data->date),&(gps_data->mode));
/*sscanf函数为从字符串输入,上面这句话的意思是将ptr内存单元的值作为输入分别输入到后面的结构体成员*/return 0;
} /* ----- End of gps_analyis()  ----- *//***************************************************************************************  Description:*   Input Args:*  Output Args:* Return Value:*************************************************************************************/
int print_gps (GPRMC *gps_data)
{printf("                                                           \n");printf("                                                           \n");printf("===========================================================\n");printf("==                   全球GPS定位导航模块                 ==\n");printf("==              开发人员:唐彬                         ==\n");printf("==              邮箱:tangbinmvp@gmail.com               ==\n");printf("==              平台:fl2440                             ==\n");printf("===========================================================\n");printf("                                                           \n");printf("===========================================================\n");printf("==   GPS状态位 : %c  [A:有效状态 V:无效状态]              \n",gps_data->pos_state);printf("==   GPS模式位 : %c  [A:自主定位 D:差分定位]               \n", gps_data->mode);printf("==   日期 : 20%02d-%02d-%02d                                  \n",gps_data->date%100,(gps_data->date%10000)/100,gps_data->date/10000);printf("==   时间 : %02d:%02d:%02d                                   \n",(gps_data->time/10000+8)%24,(gps_data->time%10000)/100,gps_data->time%100);printf("==   纬度 : 北纬:%d度%d分%d秒                              \n", ((int)gps_data->latitude) / 100, (int)(gps_data->latitude - ((int)gps_data->latitude / 100 * 100)), (int)(((gps_data->latitude - ((int)gps_data->latitude / 100 * 100)) - ((int)gps_data->latitude - ((int)gps_data->latitude / 100 * 100))) * 60.0));printf("==   经度 : 东经:%d度%d分%d秒                              \n", ((int)gps_data->longitude) / 100, (int)(gps_data->longitude - ((int)gps_data->longitude / 100 * 100)), (int)(((gps_data->longitude - ((int)gps_data->longitude / 100 * 100)) - ((int)gps_data->longitude - ((int)gps_data->longitude / 100 * 100))) * 60.0));printf("==   速度 : %.3f  m/s                                      \n",gps_data->speed);printf("==                                                       \n");printf("============================================================\n");return 0;
} /* ----- End of printf_gps()  ----- */

对于字段的分析,在上上篇博文已经解读,不过我们要把数据转化一下,方便我们记录和识别。
1. 时间,这个是格林威治时间即世界时间(UTC),把它转换成我们用的北京时间(BTC),在这个时间基础上加8个小时。
2. 经纬度,GPRMC返回的纬度数据位ddmm.mmmm格式即度分格式,我们把它转换成常见的度分秒的格式,计算方法:如接收到的纬度是:3029.60430
3029.60430/100=30.2960430可以直接读出30度, 3029.60430–30*100=29.60430, 可以直接读出29分
(29.60430–29)*60 =0.60430*60=36.258读出36秒, 所以纬度是:30度29分36秒。
3. 南北纬东西经,N:北纬。S:南纬。E:东经。W:西经。
4. 速率,GPRMC返回的速率值是海里/时,单位是节,把它转换成千米/时,换算为:1海里=1.85公里,把得到的速率乘以1.85。
5. 航向,指的是偏离正北的角度
6. 日期,GPRMC的日期格式为:ddmmyy,如:040617表示2017年06月04日,这个日期是准确的,不需要转换。

主函数gps_main.c,这里便涉及到了串口的打开,读操作,以及调用了串口设置函数:

/*********************************************************************************
*      Copyright:  (C) 2017 TangBin<tangbinmvp@gmail.com>
*                  All rights reserved.
*
*       Filename:  gps_main.c
*    Description:  This file
*
*        Version:  1.0.0(06/04/2017)
*         Author:  TangBin <tangbinmvp@gmail.com>
*      ChangeLog:  1, Release initial version on "06/04/2017 08:07:14 PM"
*
********************************************************************************/
#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 set_serial(int fd,int nSpeed, int nBits, char nEvent, int nStop);
int gps_analyse(char *buff,GPRMC *gps_date);
int print_gps(GPRMC *gps_date);/*********************************************************************************  Description:*   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 ttyUSB0 failed.\n");
        return -1;
    }    set_serial( 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_analyse(gps_buff,&gprmc);        print_gps(&gprmc);
    }    close(fd);
    return 0;
} /* ----- End of main() ----- */

gps.h:

/*********************************************************************************      Copyright:  (C) 2017 TangBin<tangbinmvp@gmail.com>*                  All rights reserved.**       Filename:  gps.h*    Description:  This head file **        Version:  1.0.0(06/04/2017)*         Author:  TangBin <tangbinmvp@gmail.com>*      ChangeLog:  1, Release initial version on "06/04/2017 08:10:52 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

接下来使用Makefile编译,
Makefile:

  1 CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc2 3 objs=s_uart.o gps_analyse.o gps_main.o4 srcs=s_uart.c gps_analyse.c gps_main.c5 6 gps_test: $(objs)7         $(CC) -o gps_test $(objs)8             @make clean9 10 gps_main.o: $(srcs) gps.h11         $(CC) -c  $(srcs) 12 13 set_uart.o:  suart.c14         $(CC) -c  s_uart.c15 16 analyse_gps.o: gps_analyse.c gps.h17         $(CC) -c  gps_analyse.c18 19 clean:  20         rm *.o
[tangbin@localhost gps]$ ls
gps_analyse.c  gps.h  gps_main.c  gps_test  Makefile  s_uart.c

将编译生成的gps_test下载到开发板,运行测试:

安信可-A7模块——C语言编程实现GPS功能相关推荐

  1. 安信可A7模块 GPRS/GPS使用教程

    [转载请注明出处: http://blog.csdn.net/leytton/article/details/72724081] 一.引脚接线 安信可A7模块包含了GPRS(网络数据传输)和GPS(卫 ...

  2. 安信可A7模块实现拨号发短信

    安信可A7模块分为GPS和GPRS部分,这里实现拨号和发短信功能用到GPRS模块.直奔主题:实现拨号和发短信功能的步骤. 1:首先用串口调试助手检验一下模块是否能正常工作,各部分功能是否有用. 串口号 ...

  3. 安信可-A7模块——GPRS基本AT命令

    所使用的模块是安信可开发的A7,该模块整合了GPS和GPRS的功能,先来学习一下GPRS使用AT命令进行打电话.接电话以及收发短信. 模块说明: 使用TTL电平,串口连接接线好,插入SIM卡(仅支持移 ...

  4. 安信可A7模块GPRS功能测试及初步学习AT指令

    一.GPRS简介 GSM模块,是将GSM射频芯片.基带处理芯片.存储器.功放器件等集成在一块线路板上,具有独立的操作系统.GSM射频处理.基带处理并提供标准接口的功能模块.GSM模块根据其提供的数据传 ...

  5. 安信可A7模块介绍,以及GPRS基本测试命令

    一.模块介绍:       该模块分为GPRS和GPS两个部分,GPRS支持AT命令,可用AT命令对其进行操作.       电源开关打开后,按PWR_KEY(模块启动按钮)按键1s以上启动内核(类同 ...

  6. 安信可 A7模块——GPRS之AT命令

    AT 测试GPRS模块是否连接完好 >AT/*成功返回OK*/ AT+CPIN:检测手机SIM卡是否安装好 >AT+CPIN? //检测手机SIM卡是否安装好 +CPIN:READY // ...

  7. 安信可A7模块---GPRS之AT命令测试

    1.基础测试指令 >AT 测试AT指令是否能用有返回 ,成功返回OKOK>AT+CPIN? 测试SIM卡是否准备好 ,安装好返回ready+CPIN:READYOK>AT+CCID ...

  8. 乐鑫esp8266学习rtos3.0笔记:仅1M flash 的安信可 ESP-01S 模块,如何二次开发?如何对其 OTA 远程升级固件!

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个" ...

  9. 【安信可A9G专题③】安信可A9G模块连接机智云APP教程;

    本系列博客学习由 安信可科技 - 官方博客 技术分享,如有疑问请留言或联系邮箱. 1.A9G环境在windows上搭建并编译,串口打印 Hello GPRS 2.A9G在微信公众号上的定位功能笔记分享 ...

最新文章

  1. nginx 部署antd_design_pro
  2. UA MATH563 概率论的数学基础1 概率空间2 可列状态空间
  3. 黄斑区隆起原因诊断过程+黄斑反复水肿问题
  4. Linux中.rpm,Linux中rpm的使用
  5. 【Python】Python实战从入门到精通之六 -- 教你读取文件
  6. python寻找1000以内的阿姆斯特朗数
  7. 生活,不求深刻,只求简单。
  8. lepus监控mysql慢查询_天兔(Lepus 3.8)收集MySQL慢查询
  9. 用计算机打字英语,用来打字练习的英文文章
  10. 精选 8个 学习英语的APP,完全免费,适合不同阶段的你
  11. suse linux安装rpm包,suse linux rpm 安装
  12. python游戏书籍推荐_有什么好的自学 Python 的书籍推荐?
  13. SAS 系统全称为Statistics Analysis System
  14. python五大模块_python-5-常用模块
  15. python selenium学习之新浪微博
  16. Fabric 009 NodeJs Express安装与运行记录
  17. windows server 2003安装组件提示插入cd
  18. vivos9开启定位服务设置步骤介绍(图文教程)
  19. java怎么把字符串转换成字符数组
  20. [译] 2019 年了,为什么我还在用 jQuery?

热门文章

  1. 希望不遥远,层层歌声飞
  2. gps冷启动,温启动和热启动源码分析
  3. JSP是如何编译成servlet并提供服务的
  4. Python ImportError: DLL load failed: %1 不是有效的 Win32 应用程序
  5. 【GAMES201学习笔记】00 - Taichi三维可视化 - Taichi_THREE
  6. 致电子类专业学生的一封信
  7. 《深度学习入门——基于Python的理论与实现》斋藤康毅学习笔记(一)
  8. 全栈工程师的辛苦路程
  9. 设计模式之Bridge(转载banq)
  10. Android 谷歌相册-云照片-分享到应用 方法