当前位置:编程学习 > C/C++ >>

c语言解码GPS--实现篇

  通过自己这几天的努力终于把GPS数据全部进行了解码,相信看了我的日志的人也期待了好久,资源在于分享,才能获得进步;相对于网上直接调用接口不同的是从C的方向解决问题能让问题更加的清晰,本设计芯片采用的是联星的CC550-BG模块,满足大多数芯片性能,系统是在LINUX系统下面实现,选用ttyS0节点,根据不同借口,串口线选择的是RS-232,相信大家也有所了解,详细的请看我代码,都有详细的解释,希望帮到大家,这里我只解析了GPRMC格式的编码,大家也可以把其他几种格式的编码解析同样解析出来,只要在read_data()函数里面strncmp()的array数组改变名称就可以,可以把他写成Switch格式的解码选择器,好了废话不多说,贴上我的代码!

[html] 
#include <stdio.h>      /*标准输入输出定义*/ 
#include <stdlib.h>     /*标准函数库定义*/ 
#include <unistd.h>     /*Unix 标准函数定义*/ 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <errno.h> 
#include <string.h> 
#include <fcntl.h> 
#include <termios.h> 
 
//#define  dev  "/dev/ttyS0" 
#define  BUFF_SIZE 512 
#define  MAX_COM_NUM 3 
 
int  SectionID=0,i=0; 
 
 struct data 

    char GPS_time[20];          //UTC时间 
    char GPS_sv;               //使用卫星 
    char GPS_wd[12];           //纬度 
    char GPS_jd[12];           //经度 
    //char GPS_warn;             //定位警告  
    char GPS_speed[5];         //速度 
    char GPS_date[8];          //UTC日期           
         
}GPS_DATA; 
 
 
 
int set_com_config(int fd,int baud_rate,int data_bits,char parity,int stop_bits) 

    struct termios new_cfg,old_cfg; 
    int speed; 
    //保存并测试现有串口参数设置,在这里如果串口号出错,会有相关的出错信息 
     
    if(tcgetattr(fd,&old_cfg)!=0) 
    { 
        perror("tcgetattr"); 
        return -1; 
    } 
     tcflush(fd, TCIOFLUSH); 
    new_cfg=old_cfg; 
    cfmakeraw(&new_cfg);//配置为原始模式 
    new_cfg.c_cflag&=~CSIZE; 
 
    //设置波特率 
    switch(baud_rate) 
    { 
        case 2400: 
        { 
            speed = B2400; 
            break; 
        } 
        case 4800: 
        { 
            speed = B4800; 
            break; 
        } 
        case 9600: 
        { 
            speed = B9600; 
            break; 
        } 
        case 19200: 
        { 
            speed = B19200; 
            break; 
        } 
        case 38400: 
        { 
            speed = B38400; 
            break; 
        } 
        case 115200: 
        { 
            speed = B115200; 
            break;  
        } 
         
 
    } 
    cfsetispeed(&new_cfg,speed); 
    cfsetospeed(&new_cfg,speed); 
    //设置数据位 
 
    switch(data_bits) 
    { 
        case 7: 
        { 
            new_cfg.c_cflag|=CS7; 
            break; 
        } 
         
        case 8: 
        { 
            new_cfg.c_cflag|=CS8; 
            break; 
        } 
         
    } 
 
    //设置停止位 
    switch(stop_bits) 
    { 
        case 1: 
        { 
            new_cfg.c_cflag &=~CSTOPB; 
            break; 
        } 
 
        case 2: 
        { 
            new_cfg.c_cflag |=CSTOPB; 
            break; 
        } 
         
         
    } 
 
    //设置奇偶校验位 
    switch(parity) 
&nb

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,