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

串口波特率自适应算法(仿真通过) 最近在整理串口通信的时候,敲完程序,想到能不能实现波特率自适应功能(起初想实现任意频率的波特率识别,后来发现能力不够,那就转为常见波特率识别吧)。 第一步查阅资料看看别人这是咋做的:波特率自适应常见方法: 1.硬件检测波特率,一些硬件设备自带波特率检测功能例如一些STM32的单片机(硬件检测没啥好说的)。 2.软件检测波特率: (1):特征值匹配:收发双方约定一个特殊字符,接收方根据接受的数据查表确定波特率。 李斌斌,冯涛,谷丽. 串口波特率与数据位参数自适应算法的研究与实现[J]. 计算机光盘软件与应用, 阅读详情

转载请注明:http://blog.youkuaiyun.com/wang_zheng_kai

导航制导与控制实验室 2014年11月10日

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

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

/*
 * gps.c
 *
 * um220 test
 *
 * Author: Wang Zhengkai <449811900@qq.com>
 *
 */
#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
</pre><pre code_snippet_id="478189" snippet_file_name="blog_20140930_2_1496439" name="code" class="objc">/************************************************
******* 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;
}


单片机+北斗模块实现定位 本文原创,转载请注明出处。小编可能以后不会在简书上更新了,因为这里的markdown 编辑器太不好用了,没有优快云 上面的好用,也希望粉丝们多多关注本人优快云(一样的昵称呦)。 导航是继移动通信之后发展最快的信息产业之一,只要是设计到位置、速度、时间信息的领域斗鱼卫星导航技术相关。中国北斗卫星导航系统是我国自主研制的全球导航系统,是继美国定位系统(GPS)、俄罗斯格洛纳斯卫星导航系统之后的第... 阅读详情

相关推荐

STM32F103C8T6 UM220北斗GPS模块NMEA协议解析与OLED显示实战

本文详细介绍了基于STM32F103C8T6微控制器解析UM220北斗GPS模块NMEA协议数据并通过OLED显示的实战项目。内容涵盖硬件连接、串口配置、NMEA协议解析、坐标转换及显示界面设计,为开发车载导航和户外追踪设备提供完整解决方案。

pea55的博客 1109

MU220模块 串口

项目用到定位功能。之前有用过瑞士ublox定位模块。 这次硬件选型用的 国产 和芯星通公司的 导航产品系列里的 UM220-IV M。 低功耗是选型的一个主要考量。它手册显示采用的是和芯星通的自主研发的GNSS 系统级芯片。 说是多系统定位, 是gps 系统, 北斗BD系统 都可以定位,或者可以混合定位。 模块上电如果不配置,那芯片手册写双系统的,就默认双系统;多系统的,默认多系统。...

xijun的专栏 1501

手把手教你用STM32F103C8T6解析UM220北斗GPS模块数据(附OLED显示完整代码)

本文详细介绍了如何使用STM32F103C8T6开发板解析UM220北斗GPS模块数据,并通过OLED显示屏实时显示定位信息。从硬件连接到NMEA协议解析,再到数据优化显示,提供了完整的代码实现和实用技巧,帮助开发者快速搭建北斗GPS定位终端。

weixin_27038245的博客 270

初次调BC模块的心得

初次接触BC20北斗定位模块的一点心得 总结下调BC20模块会卡顿的地方,基本上一般的BC26、35、ESP8266我估摸都是这种流程 AT命令 室内通过阅读手册先测试一些基础命令,保证硬件部分无问题 (当然不读手册百度更快) 命令时延 至于为什么每个命令都需要一定延时其实我也不知道是为什么,当初单用串口连接笔记本外场测试半天才出坐标,可能是以下情况: 1、天线卡扣没卡紧,螺母没旋紧 2、串口配置(当我没说) 3、最最重要的命令时延,尤其是这一句 == AT+QGNSSRD=“NMEA/GGA”==

qq_41519058的博客 697

C语言实现GPS解码——详细教程附源代码

NMEA协议定义了一系列标准的数据语句,包括GGA、RMC、VTG等。在本例中,我们将关注RMC语句,它包含了位置、速度和时间等关键信息。在本文中,我们将介绍如何使用C语言解码GPS数据。通过解码GPS数据,我们可以获取位置、速度和时间等信息。通过解码GPS数据,你可以获取到有关位置、速度和时间等信息,为实现各种应用提供了基础。如上所示,我们成功地解码了RMC语句,并获取了关键的GPS数据。函数打印解码后的数据,包括状态、纬度、经度、速度和日期等信息。的结构体,用于存储解码后的GPS数据。

CyberFlare的博客 1094

Android集成UM220-III北斗/GPS模块:从串口数据到坐标解析

串口通信是嵌入式设备与外部系统交互的基础方式,而NMEA 0183协议则是GPS/北斗等定位模块输出位置信息的标准格式。理解底层数据如何从物理引脚传输到应用层,对于在Android平台上集成定位功能至关重要。通过Android USB Host或蓝牙串口,开发者可以获取模块持续输出的NMEA语句,再经过帧拆分、校验和验证、度分坐标转换等关键步骤,最终得到可用于地图控件与业务逻辑的经纬度、速度数据。这一技术路径广泛适用于车载导航、物流追踪、手持终端等场景。本文以和芯星通UM220-III双模定位模块为例,完整

weixin_30342363的博客 157

和芯星通UM220-IV模块串口不输出和上电异常问题

最近半年做了个项目,用和芯星通UM220-IV导航模块做定位,根据手册说明和实测,当定位模块输出1PPS时,串口输出的NMEA语句中定位是有效的,也就是说,只要设置了相应的8条NMEA语句为打开状态,那么1PPS出现时,定位就有效,另外一点就是无1PPS时,定位模块串口也输出,只是定位无效。 基于这两点,我的系统设计就是:利用1PPS产生中断信号,在中断服务程序中发送信号量,通知GNSS线程读取定...

m0_37985114的博客 3354

UM220-III北斗模块Android支持包:从串口到LocationManager的HAL集成实战

GNSS接收机通过串口输出NMEA-0183语句,在Android系统中需经HAL层解析并回填至LocationManager。其技术价值在于打通硬件到应用的数据链路,实现精准定位。典型应用于车载终端、手持机等场景。本文围绕UM220-III模块的Android支持包,详解串口配置、HAL注册、NMEA解析及SELinux策略等关键环节,并分享速度单位换算、原始语句落盘等实战避坑经验。

weixin_29192211的博客 239

UM220-III GPS模块定位精度测量及差分定位配置

OEM-615 差分定位基准站配置方法 freset command 将接收机恢复出厂设置 unlogall //posave on //posave 16 取16小时定位坐标的平均值作为基站定位坐标 fix position XX.XXXXXXXXX(纬度) XXX.XXXXXXXXX(经度) XX.XXXXXXXXX(高度) interfacemode com2 ...

weixin_30823001的博客 1646

Android集成UM220-III GNSS模块:串口通信与NMEA解析实战

在Android嵌入式开发中,通过串口读取传感器数据是常见需求,而解析标准协议如NMEA 0183则是实现GNSS定位的关键。NMEA 0183定义了GNSS接收机输出的数据格式,包括经纬度、速度、时间等,理解其帧结构、校验逻辑和度分转换原理,是构建稳定定位应用的基础。随着北斗系统普及,支持GPS/BDS双系统的模块逐渐成为主流,例如和芯星通UM220-III,这类模块凭借低功耗和高灵敏度,广泛用于车载导航、手持终端和无人机等场景。技术价值在于,合理设计支持包能实现串口链路、NMEA解析与业务回调的解耦,显

weixin_29189987的博客 260

UM220-III GNSS模块Android接入详解:驱动解析到定位服务注入

GNSS模块在嵌入式设备中扮演着精准定位的核心角色,然而Android系统自带的定位框架仅支持有限的芯片方案,外部模块的串口数据流难以直接进入系统定位服务。理解Android定位架构的原理,从硬件串口驱动到NMEA协议解析,再到LocationManager数据注入,是解决这一问题的关键。这种集成方案不仅赋予车载终端、物流车机等设备高性价比的定位能力,也为工业级GNSS模块的灵活选型提供了技术保障。本文围绕UM220-III双模定位模块,结合实战经验,详细拆解其Android支持包的结构、串口接入方式、NM

weixin_28273593的博客 115

应用终端和服务器之间的交互 简单,基于UM220的北斗数据接收处理及简单应用

索菲摘 要:文章以北斗2号和GPS双系统接收模块UM220为硬件平台,利用嵌入式C#二次开发BD2/GPS-OEM板的方法,开发出了能同时运行于PC和Windows CE的跨平台程序,实现了PDA与OEM板之间的串行通讯,同时对接收到的北斗数据进行简单的解析应用,如利用GDI+绘制北斗二维星空图、采集PDA终端运行轨迹等。关键词:北斗2号;Windows CE 操作系统;PDA;串口通讯;网络通讯...

weixin_32953371的博客 1443

UM220-III Android HAL定位接入方案:北斗/GPS模组系统级集成指南

Android硬件抽象层(HAL)是连接GNSS模组与系统定位服务的关键桥梁,其核心在于通过标准化AIDL/HIDL接口实现硬件能力的安全、可控、可验证暴露。理解HAL架构原理,掌握串口通信配置、NMEA协议解析、AGPS辅助注入及SELinux权限适配等关键技术,对完成国产北斗/GPS模组(如和芯星通UM220-III)在Android 9~13平台的深度集成至关重要。该方案不仅解决‘硬件在线但系统不可见’的典型问题,更支撑高精度定位、低延迟上报与工业级稳定性需求,广泛适用于车载终端、手持PDA、应急通信

weixin_29159127的博客 126

连接和芯星通UC6226NIS串口无定位数据输出或输出乱码的原因排查

定位模块和芯片串口电平为LVTTL电平,高电平为3.3/1.8V,而电脑串口一般为RS232电平,两者之间需要进行电平转换才能进行正常通讯。确认与定位模块或芯片连接的串口号和波特率是否正确。定位模块和芯片常用的波特率为:9600、115200、230400、460800。用万用表或者示波器查看定位模块或芯片的电源输入引脚,查看供电以及电压是否正常。

Uicore的博客 672

UM220-III北斗/GPS模块Android集成:从NMEA解析到避坑指南

在嵌入式与移动开发中,Android设备通过串口或USB与GNSS模块通信是实现精准定位的常见需求。NMEA 0183作为标准协议,承载着经纬度、速度等原始定位数据,理解串口通信原理与数据分包机制是稳定解析的前提。基于USB转串口或板载UART,开发者需处理权限申请、设备枚举与波特率匹配等工程细节。这类技术常用于车辆定位、手持终端、农业导航等场景。针对和芯星通UM220-III北斗/GPS双模模块,其Android支持包集成涉及从硬件接线到NMEA语句解析的全链路,并需规避天线馈电、时间转换等坑点,确保坐标

weixin_32349093的博客 282

用51单片机解析GPS数据的源代码程序

用51单片机解析GPS数据并在12864液晶显示经纬度、时钟以及高度的源代码程序(仅供参考_不提供程序问题解答)

上一篇: 用shell脚本实现linux系统上wifi模式(STA和soft AP)的转换
下一篇: 修改linux内核kernel开机logo(小企鹅)
中華田園犬
博客等级 码龄16年 349粉丝 76原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值