【驱动】05.UART子系统

UART 子系统

硬件原理

看硬件篇-接口协议

应用编程

串口协议包的接收及解析处理_c++串口解析_顶点元的博客-CSDN博客

实现串口通信数据帧打包与解析,串口通信可靠传输,屡试不爽的数据封包与状态机数据解析程序_串口通信数据包_简单|纯粹的博客-CSDN博客

基于状态机的串口通信 - quliuliu2013 - 博客园 (cnblogs.com)

对于UART,编程的套路就是:

  • open
  • 设置行规程,比如波特率、数据位、停止位、检验位、RAW模式、一有数据就返回
  • read/write

例题1:GPS数据读取和解析

$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh 

$XXGGA语句各字段的含义和取值范围各字段的含义和取值范围见下表所示,XX取值有:

  • GPGGA:单GPS
  • BDGGA:单北斗
  • GLGGA:单GLONASS
  • GNGGA:多星联合定位
字段 含义 取值范围
<1> UTC时间hhmmss.ss 000000.00~235959.99
<2> 纬度,格式:ddmm.mmmm 000.00000~8959.9999
<3> 南北半球 N北纬 S南纬
<4> 经度格式dddmm.mmmm 00000.0000~17959.9999
<5> 东西半球 E表示东经 W表示西经
<6> GPS状态 0=未定位 1=GPS单点定位固定解 2=差分定位 3=PPS解 4=RTK固定解 5=RTK浮点解 6=估计值 7=手工输入模式 8=模拟模式
<7> 应用解算位置的卫星数 00~12
<8> HDOP 水平图形强度因子 0.500~99.000(大于6不可用)
<9> 海拔高度 -9999.9~99999.9
地球椭球面相对大地水准面的高度 (高程异常) -9999.9~99999.9
<11> 差分时间 从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空
<12> 参考站号 0000~1023;不使用DGPS时为空

$GPGGA,074529.82,2429.6717,N,11804.6973,E,1,8,1.098,42.110,,,M,,*76。

int read_gps_raw_data(int fd, char *buf)
{
	int i = 0;
	int iRet;
	char c;
	int start = 0;
	
	while (1)
	{
		iRet = read(fd, &c, 1);
		if (iRet == 1)
		{
			if (c == '$')
				start = 1;
			if (start)
			{
				buf[i++] = c;
			}
			if (c == '\n' || c == '\r')
				return 0;
		}
		else
		{
			return -1;
		}
	}
}

/* eg. $GPGGA,082559.00,4005.22599,N,11632.58234,E,1,04,3.08,14.6,M,-5.6,M,,*76"<CR><LF> */
int parse_gps_raw_data(char *buf, char *time, char *lat, char *ns, char *lng, char *ew)
{
	char tmp[10];
	
	if (buf[0] != '$')
		return -1;
	else if (strncmp(buf+3, "GGA", 3) != 0)
		return -1;
	else if (strstr(buf, ",,,,,"))
	{
		prin

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

【嵌入式八股】嵌入式Linux 文章被收录于专栏

查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇 2.计算机基础 3.硬件篇 4.嵌入式Linux【本专栏】 (建议PC端查看)

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务