gps示例代码
/* 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示例代码的更多相关文章
- 基于DotNetOpenAuth的OAuth实现示例代码: 获取access token
1. 场景 根据OAuth 2.0规范,该场景发生于下面的流程图中的(D)(E)节点,根据已经得到的authorization code获取access token. 2. 实现环境 DotNetOp ...
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...
- ActiveMQ笔记(1):编译、安装、示例代码
一.编译 虽然ActiveMQ提供了发布版本,但是建议同学们自己下载源代码编译,以后万一有坑,还可以尝试自己改改源码. 1.1 https://github.com/apache/activemq/r ...
- C#微信公众平台接入示例代码
http://mp.weixin.qq.com/wiki/17/2d4265491f12608cd170a95559800f2d.html 这是微信公众平台提供的接入指南.官网只提供了php的示例代码 ...
- 编译opengl编程指南第八版示例代码通过
最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...
- 股票数据调用示例代码php
<!--?php // +---------------------------------------------------------------------- // | JuhePHP ...
- php示例代码之类似于C#中的String.Format方法
php示例代码之类似于C#中的String.Format方法 原文来自于 http://stackoverflow.com/questions/1241177/c-string-format-equ ...
- redis 学习笔记(2)-client端示例代码
redis提供了几乎所有主流语言的client,java中主要使用二种:Jedis与Redisson 一.Jedis的使用 <dependency> <groupId>redi ...
- 正则表达式学习笔记(附:Java版示例代码)
具体学习推荐:正则表达式30分钟入门教程 . 除换行符以外的任意字符\w word,正常字符,可以当做变量名的,字母.数字.下划线.汉字\s space,空白符 ...
随机推荐
- 【Git】PHP项目自动化部署的注意事项
直接开始 1 服务器克隆项目 git clone git@*****.com/project.git 2 更改所有者 chown www:www /www/wwwroot/project/* -R 3 ...
- react一些问题
一.死循环 1.问题描述 function handleClick() { this.setState({count: ++this.state.count}); console.log(" ...
- 将你的数据导入到json格式
不知道为什么大家那么偏爱json格式,清晰?跨平台?或许这都是它的优点吧,之前我都是将我的数据放到txt中,今后就用json吧.初步写了一个写入json的模板,就这么用吧. def get_qq_05 ...
- Equinox开源项目CQRS架构分析
CQRS架构下Equinox开源项目分析 一.DDD分层架构介绍 本篇分析CQRS架构下的Equinox开源项目.该项目在github上star占有2.4k.便决定分析Equinox项目来学习下CQR ...
- php imagick添加文字和图片的方法
Imagick添加文字和图片的方法<pre><?php $image = new Imagick(); $image->readImage("/home/www/wo ...
- PAt 1099
1099 Build A Binary Search Tree (30 分) A Binary Search Tree (BST) is recursively defined as a bina ...
- AntDesign vue学习笔记(一)初始化项目
最近学习AntDesign组件使用,官方Pro例子集成度太高,不容易学习,将从最基础组件一个一个搭建. 1.创建Vue Cli项目 2.引入ant design组件 $ cnpm i --save a ...
- Java操作JSON数据(3)--fastjson操作JSON数据
fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean.本文介绍下fastjs ...
- Hive学习笔记(二)—— 安装配置
Hive安装配置及基本操作 1. Hive安装及配置 (1). 上传文件到Hadoop102节点,解压到/opt/moudle (2). 修改/opt/module/hive/conf目录下的hive ...
- C# 8.0 中开启默认接口实现
原文:C# 8.0 中开启默认接口实现 当你升级到 C# 8.0 和 .NET Core 3.0 之后,你就可以开始使用默认接口实现的功能了. 从现在开始,你可以在接口里面添加一些默认实现的成员,避免 ...