GPS模块应用程序

本文介绍了一个基于Linux的GPS模块应用,通过串口通信读取GPS数据。主要关注$GPGGA数据行,解析维度、经度、海拔等信息。程序使用strstr和sscanf函数处理接收到的数据,并在满足特定条件时打印结果。
摘要由CSDN通过智能技术生成

做了一个GPS模块的应用程序

板子是fl2440。。arm9+linux。。Linux3.0内核。。

强调的一点是。。GPS模块要放到窗子边。。要不接收不到信号。。如果放到窗子边上。。开始可能也没有信号。。等一会再看

先给出microcomputer操作的命令。。

microcom -s 4800 dev/ttyS1

我这里模块串口是ttyS1。。模块波特率是4800

在开发板上输入上面的命令后。。会乱序显示以$GPGGA,$GPRMC,$GPGSA开头的数据行。。这里的

GGA位置测定系统定位资料(Global Positioning System Fix Data)
GSV 导航卫星资料(GNSS Satellites in View)
RMC导航卫星特定精简资料(Recommended Minimum Specific GNSS Data)

我们主要关心的是$GPGGA这行

对于这条代码的解释我参照的是“Rain”微博http://www.cnblogs.com/cpcpc/archive/2010/06/28/2123120.html。。非常感谢他的博客

要了解的都介绍完了。。下面给出我们的代码。。

#include<termios.h>                                               //头文件
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <string.h>

void serial_init(int fd) //一个初始化串口的函数
{
    struct termios options;
    tcgetattr(fd, &options);
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_cflag &= ~CSIZE;
    options.c_cflag &= ~CRTSCTS;
    options.c_cflag |= CS8;
    options.c_cflag &= ~CSTOPB;
    options.c_iflag |= IGNPAR;
    options.c_oflag  = 0;
    options.c_lflag  = 0;

    cfsetispeed(&options, B4800); //注意这里是4800
    cfsetospeed(&options, B4800);
    tcsetattr(fd, TCSANOW, &options);
}


int main(int argc, char **argv) //主函数
{
    int fd, nQ, ret, nread;
    int buf = 512;
    char BUF[buf]; //定义了一个BUF。。存放串口返回的数据。。要定义的足够大。。基本都是200左右。。有时会到达300+近400
    char cX, cY, cH;
    float fX, fY, fH;

    bzero(BUF,buf); //初始化BUF

    fd = open("/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY);//打开节点
    if(fd<0) //出错返回
    {
        perror("Can't open ttyS1!\n");
    }

    serial_init(fd); //初始化串口
    while(1)
    {
        if(read(fd, BUF, sizeof(BUF))>1) //读数据到BUF。。并判断read操作是否正确。。如果read错误则清空BUF进入下一次循环
        {
            if ((strstr(BUF, "$GPGGA"))!= NULL) //查找BUF中是否有$GPGGA字符串。。并返回这个字符串的起始地址。。如果没查找到返回NULL则清空BUF进入下一次循环
            {
                ret=sscanf(BUF,"$GPGGA,%*f,%f,%c,%f,%c,%d,%*d,%*f,%f,%c",&fX, &cX, &fY, &cY, &nQ, &fH, &cH);    //提取$GPGGA中的相关数值
                if(ret==7&&(nQ==1||nQ==2))                                    //若提取出的数值为7个。。且其中的nQ位是有GPS工作。。则打印输出。。否则清空BUF进入下一次循环
                    printf("cX:fX=%c:%f,cY:fY=%c:%f,fH=%f(%c)\n",cX,fX,cY,fY,fH,cH);//从左到右打印的格式是。。维度位置。。维度。。经度位置。。经度。。海拔。。海拔单位
            }
            bzero(BUF, buf);                                                                //清空BUF
        }
        sleep(1);
    }
    close (fd); //关闭文件描述符

    return 0;
}

主要用到的两个函数是strstr和sscanf。。有疑问可以百度这两个函数的用法

因为有很多判断。。有一项不正确都不会输出结果。。所以可能的话尽量先用microcom命令测试。。如果可以正确打印信息在使用这个应用程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值