/* main.c */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <getopt.h>
#include "gps.h"
#include "serial.h" #define GPS_LEN 1024 static char *dev_name = "/dev/ttyS2";
static int baud_rate = ;
static unsigned int loop_time = ;
static struct option opts[] = {
{"device", required_argument, NULL, 'd'},
{"baud", required_argument, NULL, 'b'},
{"loop", required_argument, NULL, 'l'},
{"help", no_argument, NULL, 'h'},
}; static void parse_cmd(int argc, char *argv[])
{
int ch; while ((ch = getopt_long(argc, argv, "d:b:l:h", opts, NULL)) != -) {
switch (ch) {
case 'd':
//printf("dev_name: %s\n", optarg);
dev_name = optarg;
break;
case 'b':
//printf("baud_rate: %s\n", optarg);
baud_rate = atoi(optarg);
break;
case 'l':
//printf("loop_time: %s\n", optarg);
loop_time = atoi(optarg);
break;
case 'h':
printf("Usage: %s -d dev_name -b baud_rate\n", argv[]);
printf("like:\n");
printf("\t %s -d /dev/ttyS2\n", argv[]);
printf("\t %s --device /dev/ttyS2 -b 9600\n", argv[]);
break;
default:
printf("Unknown option or invalid format!\n");
printf("Pls: %s --help for more info\n", argv[]);
break;
}
}
} int main(int argc, char *argv[])
{
int fd=;
int cnt=;
char buff[GPS_LEN]; parse_cmd(argc, argv);
printf("dev_name=%s, baud_rate=%d\n", dev_name, baud_rate); fd = open(dev_name,O_RDWR|O_NOCTTY|O_NDELAY);
if(fd < ) {
printf("Can't Open %s\n", dev_name);
return -;
} set_serial(fd, baud_rate, , 'N', ); while(loop_time--) {
memset(buff, , GPS_LEN);
sleep();
cnt = read(fd, buff, GPS_LEN);
if(cnt<) {
printf("read error\n");
return -;
}
printf("read cnt: %d, as fallow:\n%s\n", cnt, buff); if(cnt)
gps_analyse(buff); } close(fd);
return ;
}

main.c

#include <string.h>
#include <stdio.h>
#include "gps.h" void print_gprmc(struct gprmc *gprmc_data)
{
printf("===================== GPRMC ====================\n");
printf("== GPS state bit : %c [A:有效状态 V:无效状态]\n", gprmc_data->pos_state);
printf("== GPS mode bit : %c [A:自主定位 D:差分定位]\n", gprmc_data->mode);
printf("== Date : 20%02d-%02d-%02d \n", gprmc_data->date%,(gprmc_data->date%)/,gprmc_data->date/);
printf("== Time : %02d:%02d:%02d \n", (gprmc_data->time/+)%,(gprmc_data->time%)/,gprmc_data->time%);
printf("== 纬度 : 北纬:%d度%d分%d秒 \n", ((int)gprmc_data->latitude) / , (int)(gprmc_data->latitude - ((int)gprmc_data->latitude / * )), (int)(((gprmc_data->latitude - ((int)gprmc_data->latitude / * )) - ((int)gprmc_data->latitude - ((int)gprmc_data->latitude / * ))) * 60.0));
printf("== 经度 : 东经:%d度%d分%d秒 \n", ((int)gprmc_data->longitude) / , (int)(gprmc_data->longitude - ((int)gprmc_data->longitude / * )), (int)(((gprmc_data->longitude - ((int)gprmc_data->longitude / * )) - ((int)gprmc_data->longitude - ((int)gprmc_data->longitude / * ))) * 60.0));
printf("== 速度 : %.3f m/s \n", gprmc_data->speed);
printf("================================================\n");
} void gprmc_analyse(char *buff)
{
char *ptr=NULL;
struct gprmc gprmc_data; /* FIXME:
* 1. 002743.261 the last '261' will change so sometime can not match
* 2. only attach once from buff, maybe should use while(ptr != NULL) ...
*/
/* eg: $GPRMC,002743.261,V,,,,,0.00,0.00,060180,,,N*45 */
if(NULL != (ptr=strstr(buff, "$GPRMC"))) {
sscanf(ptr, "$GPRMC,%d.261,%c,%f,N,%f,E,%f,%f,%d,,,%c*",
&(gprmc_data.time), &(gprmc_data.pos_state), &(gprmc_data.latitude),
&(gprmc_data.longitude), &(gprmc_data.speed), &(gprmc_data.direction),
&(gprmc_data.date), &(gprmc_data.mode)); print_gprmc(&gprmc_data);
}
} void gps_analyse(char *buff)
{
gprmc_analyse(buff);
//gpgsv_analyse(buff); // do more type parse
}

gps.c

#ifndef __GPS_H__
#define __GPS_H__ struct gprmc
{
unsigned int time;/* gps定位时间 */
char pos_state;/*gps状态位*/
float latitude;/*纬度 */
float longitude;/* 经度 */
float speed; /* 速度 */
float direction;/*航向 */
unsigned int date; /*日期 */
float declination; /* 磁偏角 */
char dd;
char mode;/* GPS模式位 */
}; extern void gps_analyse(char *buff); #endif

gps.h

#include <stdio.h>
#include <termios.h>
#include <stdlib.h>
#include <string.h>
#include "serial.h" int set_serial(int fd, int baud_rate, int nBits, char nEvent, int nStop)
{
struct termios tty_cfg; memset(&tty_cfg, , sizeof(tty_cfg));
tty_cfg.c_cflag |= (CLOCAL|CREAD); /* CREAD 开启串行数据接收,CLOCAL并打开本地连接模式 */
tty_cfg.c_cflag &= ~CSIZE; /* 设置数据位 */ switch(baud_rate) {
case :
cfsetispeed(&tty_cfg, B2400);
cfsetospeed(&tty_cfg, B2400);
break;
case :
cfsetispeed(&tty_cfg, B4800);
cfsetospeed(&tty_cfg, B4800);
break;
case :
cfsetispeed(&tty_cfg, B9600);
cfsetospeed(&tty_cfg, B9600);
break;
case :
cfsetispeed(&tty_cfg, B115200);
cfsetospeed(&tty_cfg, B115200);
break;
default:
cfsetispeed(&tty_cfg, B9600);
cfsetospeed(&tty_cfg, B9600);
break;
} switch(nBits) {
case :
tty_cfg.c_cflag |= CS7;
break;
case :
tty_cfg.c_cflag |= CS8;
break;
} switch(nEvent) {
case '': /* 奇校验 */
tty_cfg.c_cflag |= PARENB; /* 开启奇偶校验 */
tty_cfg.c_iflag |= (INPCK | ISTRIP); /*INPCK打开输入奇偶校验;ISTRIP去除字符的第八个比特 */
tty_cfg.c_cflag |= PARODD; /*启用奇校验(默认为偶校验)*/
break;
case 'E': /*偶校验*/
tty_cfg.c_cflag |= PARENB; /*开启奇偶校验 */
tty_cfg.c_iflag |= ( INPCK | ISTRIP); /*打开输入奇偶校验并去除字符第八个比特*/
tty_cfg.c_cflag &= ~PARODD; /*启用偶校验*/
break;
case 'N': /*无奇偶校验*/
tty_cfg.c_cflag &= ~PARENB;
break;
} /* 设置停止位;若停止位为1,则清除CSTOPB,若停止位为2,则激活CSTOPB */
if(nStop == )
tty_cfg.c_cflag &= ~CSTOPB; /*默认为一位停止位; */
else if( nStop == )
tty_cfg.c_cflag |= CSTOPB; /* CSTOPB表示送两位停止位 */ /* 设置最少字符和等待时间,对于接收字符和等待时间没有特别的要求时*/
tty_cfg.c_cc[VTIME] = ; /* 非规范模式读取时的超时时间;*/
tty_cfg.c_cc[VMIN] = ; /* 非规范模式读取时的最小字符数*/
tcflush(fd, TCIFLUSH); /* tcflush清空终端未完成的输入/输出请求及数据;TCIFLUSH表示清空正收到的数据,且不读取出来 */ /*激活配置使其生效*/
if((tcsetattr(fd, TCSANOW, &tty_cfg)) != ) {
printf("com set error");
exit();
} return ;
}

serial.c

#ifndef __FUZK_SERIAL_H__
#define __FUZK_SERIAL_H__ extern int set_serial(int fd, int baud_rate, int nBits, char nEvent, int nStop); #endif

serial.h

CC = /opt/toolchain/arm-2012.03/bin/arm-none-linux-gnueabi-gcc
CFLAGS = -O1 TARGET = gps_test
OBJS = serial.o gps.o main.o $(TARGET): $(OBJS)
$(CC) -o $(TARGET) $(OBJS) $(CFLAGS) $(OBJS): %o:%c
$(CC) -c $(CFLAGS) $< -o $@ clean:
rm -f $(TARGET) $(OBJS)

Makefile

gps示例代码的更多相关文章

  1. 基于DotNetOpenAuth的OAuth实现示例代码: 获取access token

    1. 场景 根据OAuth 2.0规范,该场景发生于下面的流程图中的(D)(E)节点,根据已经得到的authorization code获取access token. 2. 实现环境 DotNetOp ...

  2. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

  3. ActiveMQ笔记(1):编译、安装、示例代码

    一.编译 虽然ActiveMQ提供了发布版本,但是建议同学们自己下载源代码编译,以后万一有坑,还可以尝试自己改改源码. 1.1 https://github.com/apache/activemq/r ...

  4. C#微信公众平台接入示例代码

    http://mp.weixin.qq.com/wiki/17/2d4265491f12608cd170a95559800f2d.html 这是微信公众平台提供的接入指南.官网只提供了php的示例代码 ...

  5. 编译opengl编程指南第八版示例代码通过

    最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...

  6. 股票数据调用示例代码php

    <!--?php // +---------------------------------------------------------------------- // | JuhePHP ...

  7. php示例代码之类似于C#中的String.Format方法

    php示例代码之类似于C#中的String.Format方法 原文来自于  http://stackoverflow.com/questions/1241177/c-string-format-equ ...

  8. redis 学习笔记(2)-client端示例代码

    redis提供了几乎所有主流语言的client,java中主要使用二种:Jedis与Redisson 一.Jedis的使用 <dependency> <groupId>redi ...

  9. 正则表达式学习笔记(附:Java版示例代码)

    具体学习推荐:正则表达式30分钟入门教程 .         除换行符以外的任意字符\w      word,正常字符,可以当做变量名的,字母.数字.下划线.汉字\s        space,空白符 ...

随机推荐

  1. 升级到11.2.0.4后用srvctl无法启用数据库实例,报CRS-0254: authorization failure

    在standby database上从11.2.0.3升级11.2.0.4,然后打了补丁PATCH SET UPDATE 11.2.0.4.190115后,无法用srvctl启动第二个节点数据库实例: ...

  2. Tplink路由器怎么设置无线桥接(转载)

    原始文章路径:http://www.pc6.com/video/8548.html .以下为转载内容(少量修改) 第1步 进入副路由器后台,选择网络参数,LAN口设置,把IP地址改成目标网络同一段的I ...

  3. 【Spring Cloud学习之二】服务注册和发现

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 Spring Cloud 1.2 一.EurekaEureka是Netflix开源的一个RESTful服务,主要用于服 ...

  4. 【bat】【windows】win10查看所有wifi密码

    win10的可以,win7的好像不行 @echo off & setlocal EnableDelayedExpansion title 查看所有wifi和密码 for /f "us ...

  5. MD5用户密码加密工具类 MD5Util

    一般记录用户密码,我们都是通过MD5加密配置的形式.这里记录一下,MD5加密的工具类. package com.mms.utils; import java.security.MessageDiges ...

  6. vue判断图片为空或者图片加载不成功时显示默认图片

    纯css解决方案: <img src="broken.png" alt=""> img { position: relative; } img:af ...

  7. html中定义模板

    定义一个html中不解析的模板,有如下三种方法1.使用<xmp>标签 <xmp id="test"> <div>测试</div> & ...

  8. 第三节:一些指令总结(Nuget、)

    一. NuGet 1. 获取当前项目已经安装的类库:Get-Package 2. 安装指定版本:install-package <程序包名> -version <版本号> 3. ...

  9. C 猜猜猜😀文字小游戏

    前言 - 随机性 随机数生成 - https://zh.wikipedia.org/wiki/%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%94%9F%E6%88%90 没啥事情, 写 ...

  10. 【题解】Luogu P5300 [GXOI/GZOI2019]与或和

    原题传送门 我们珂以拆位,拆成一个个0/1矩阵 贡献珂以用全0,全1的子矩阵的个数来计算 全0,全1的子矩阵的个数珂以用悬线法/单调栈解决 #include <bits/stdc++.h> ...