从串口设置、读取、并分析um220模块的数据

好久没有写博客了,先从一个小小的程序开始一段新的历程吧;

最近的项目主要还是用的的是linux系统,这篇文章主要介绍如何从设置、读取BD+gps模块(um220),实际上主要是对串口(UART)的操作。

/*
 * gps.c
 *
 * um220 test
 *
 * Author: Wang Zhengkai <[email protected]>
 *
 */
#include <stdio.h>
#include <termios.h>
#include <strings.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
/*我用的是ubuntu的电脑测试的,使用的串口是ttyS0*/
#define DEV_NODE "/dev/ttyS0"
#define MAX_PACKET_SIZE 1024

/* Initialize serial port options */
static void setTermios(struct termios * pNewtio, int uBaudRate)
{
	bzero(pNewtio, sizeof(struct termios)); /* clear struct for new port settings */
	//8N1
	pNewtio->c_cflag = uBaudRate | CS8 | CREAD | CLOCAL;
	pNewtio->c_iflag = IGNPAR;
	pNewtio->c_oflag = 0;
	pNewtio->c_lflag = 0; //non ICANON
}

/*设置um220串口的波特率9600,并刷新使其立即生效*/
void um220_uart_init(int ttyFd,struct termios *oldtio,struct termios *newtio)
{

	tcgetattr(ttyFd, oldtio); /* save current serial port settings */
	setTermios(newtio, B9600);
	tcflush(ttyFd, TCIFLUSH);
	tcsetattr(ttyFd, TCSANOW, newtio);
}

/*Analysis Data of um220*/
void parseData(char *buf)
{
	int nQ, nN, nB, nC;
	char cX, cY, cM1, cM2;
	float fTime, fX, fY, fP, fH, fB, fD;

	if (buf == NULL)
	{
		printf("error: Can't get buf!\n");
		return;
	}
	sscanf(buf,"$GNGGA,%f,%f,%c,%f,%c,%d,%02d,%f,%f,%c,%f,%c,%f,%04d%02x",&fTime,&fX,&cX,&fY,&cY,&nQ,&nN,&fP,&fH,&cM1,&fB,&cM2, &fD, &nB, &nC);

	printf("x: %c %f, y: %c %f, h %f, satellite: %d\n",cX, fX, cY, fY, fH, nN);
/*cX:N or S;fX:纬度;cY:E or W;fY:经度;fH:height;nN:卫星个数*/
}

int main(void)
{
	int nb,command;
	int um220_fd = -1;
	char newbuf[MAX_PACKET_SIZE];
	char msg[20],*ret=NULL;
	struct termios oldtio, newtio;

	/*Open Um220 Module*/
	if ((um220_fd = open(DEV_NODE, O_RDWR)) < 0) {
		printf("error: Can't open serial port %s!\n", DEV_NODE);
                return -1;
        }

	/*Init Uart for Um220*/
	um220_uart_init(um220_fd,&oldtio,&newtio);

	/*Set Um220 options*/
	printf("Please select modules of um220\n");
	printf("1.BD module\n");
	printf("2.GPS module\n");
	printf("3.BD+GPS module\n");
	if(scanf("%d",&command) != 1)
	{
		printf("error:input is wrong!\n");
	}
	switch(command)
	{
		case 1:
			memset(msg, 0, sizeof(msg));
			strcpy(msg,"$cfgsys,h01");
			if(write(um220_fd,msg,sizeof(msg)) < 0)
			printf("Failed to set BD modules!\n");
			break;
		case 2:
			memset(msg, 0, sizeof(msg));
			strcpy(msg,"$cfgsys,h10");
			if(write(um220_fd,msg,sizeof(msg)) < 0)
			printf("Failed to set GPS modules!\n");
			break;
		case 3:
			memset(msg, 0, sizeof(msg));
			strcpy(msg,"$cfgsys,h11");
			if(write(um220_fd,msg,sizeof(msg)) < 0)
			printf("Failed to set BD+GPS modules!\n");
			break;
		default:
			printf("Can't identify command,set BD+GPS modules!\n");
			memset(msg, 0, sizeof(msg));
			strcpy(msg,"$cfgsys,h11");
			if(write(um220_fd,msg,sizeof(msg)) < 0)
			printf("Failed to set BD+GPS modules!\n");
	}

	for(;;)
	{
	/*Read Data from Um220*/
	memset(newbuf, 0, 1024);
	nb = read(um220_fd, newbuf, MAX_PACKET_SIZE);
        if (nb == -1)
		{
                perror("read uart error");
		return -1;
		}
	if ((ret=strstr(newbuf, "$GNGGA")) != NULL)
		{
	/*Analysis Data*/
		parseData(ret);
		}
	sleep(1);
	}
	/*Recover Settings Of Serial Port*/
	tcsetattr(um220_fd,TCSANOW,&oldtio);
	/*Close Um220_fd*/
	close(um220_fd);
	return 0;
}
时间: 2024-10-07 14:25:34

从串口设置、读取、并分析um220模块的数据的相关文章

nginx源码分析--nginx模块解析

nginx的模块非常之多,可以认为所有代码都是以模块的形式组织,这包括核心模块和功能模块,针对不同的应用场合,并非所有的功能模块都要被用到,附录A给出的是默认configure(即简单的http服务器应用)下被连接的模块,这里虽说是模块连接,但nginx不会像apache或lighttpd那样在编译时生成so动态库而在程序执行时再进行动态加载,nginx模块源文件会在生成nginx时就直接被编译到其二进制执行文件中,所以如果要选用不同的功能模块,必须对nginx做重新配置和编译.对于功能模块的选

nginx源码分析之模块初始化

在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要通过结合源码来分析模块的初始化过程. 稍微了解nginx的人都知道nginx是高度模块化的,各个功能都封装在模块中,而各个模块的初始化则是根据配置文件来进行的,下面我们会看到nginx边解析配置文件中的指令,边初始化指令所属的模块,指令其实就是指示怎样初始化模块的. 模块初始化框架 模块的初始化主要

Android SystemProperties设置/读取

1.导包 import android.os.SystemProperties; 2. Android SystemProperties设置/读取 #设置 Systemproperties.set(name, value): #读取 Systemproperties.get(name): 进行系统属性设置的程序也必须有system或root权限, 如何将android程序的权限提升到system权限?方法是这样的: 1.在AndroidManifest.xml中,在manifest加入andro

串口设置的一般步骤

1) 串口时钟使能,GPIO 时钟使能 2) 串口复位 3) GPIO 端口模式设置 4) 串口参数初始化 5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤) 6) 使能串口 7) 编写中断处理函数 .串口时钟使能.串口是挂载在 APB2 下面的外设,所以使能函数为: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1): 2.串口复位.当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置 这个外设达到让其重新工作的目的.一

Linux串口设置及编程(转)

用户常见的数据通信的基本方式可分为并行通信和串行通信. 并行通信是指利用多条数据传输线将一个资料的各位同时传送.特点是传输速度快,适用于短距离通信,但要求传输速度较高的应用场合. 串行通信是指利用一条传输线将资料一位位的顺序传送.特点是通信线路简单,利用简单的线缆就可以实现通信,减低成本,适用于远距离通信,但传输速度慢的应用场合.常用的串口有RS-232-C接口(全称是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”). UART控制器:可以工作在Interr

区块链教程btcpool矿池源码分析StratumServer模块解析

兄弟连区块链教程btcpool矿池源码分析StratumServer模块解析 核心机制总结 接收的job延迟超过60秒将丢弃 如果job中prevHash与本地job中prevHash不同,即为已产生新块,job中isClean状态将置为true????* true即要求矿机立即切换job 三种情况下将向矿机下发新job:???? 收到新高度的job???? 过去一个job为新高度且为空块job,且最新job为非空块job????* 达到预定的时间间隔30秒 最近一次下发job的时间将写入文件(

agruments应用——求出函数参数的总合&amp;&amp;css函数——设置/读取对象的属性&amp;&amp;当前输入框高亮显

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

poll函数和串口设置.DOC

2015.1.24 今天星期六,多云,早晨8:17起床的,今天是来南京起床最迟的一天,因为昨晚睡得有点迟,今天又不用上课,整个人有点放松.收拾好来到教室,教室门没有开,胡明也到了,其他人还在宿舍睡觉,等了10分钟还没有人来开门,就决定出去逛逛,看看南京市有什么好玩的或者特别的.9点没到从鸿运大厦出门,回来的时候10点10分左右,走了一个多小时,百度地图还是有点管用的,起码没有让我迷路.逛了一圈,以前觉得南京算是个大城市,应该比较繁华或者时尚之类的,但是现在完全没有这种感觉,想到以后的工作,我就想

IIS7 如何设置读取、脚本和可执行文件的执行权限

IIS7 如何设置读取.脚本和可执行文件的执行权限 对IIS服务器,通过配置功能权限可以设置访问策略,访问策略指定 IIS 中 Web 服务器.站点.应用程序.目录或文件级别的所有处理程序可以具有的权限类型. 可以在访问策略中启用或禁用的功能权限包括读取.脚本和执行. 处理程序能否运行由访问策略以及处理程序所需的访问设置共同决定. 如果处理程序需要未在访问策略中启用的功能权限类型,该处理程序将被禁用,并且该处理程序处理的所有请求(根据处理程序映射)都将失败,除非请求可以由另 一个处理程序处理.在