串口通信(7)判断数据帧头来接收一串数据

news2024/11/27 2:36:10

 本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步!

> 发布人:@日月同辉,与我共生_单片机-CSDN博客

> 欢迎你为独创博主日月同辉,与我共生点赞❤❤❤+关注👍+收藏🌹+评论☺。

系列专栏: CSDN-单片机串口通信学习系列🎁

> 我的格言是:“尽最大努力,做最好的自己!💪

要转载,请提前告知!!!

版权声明:本文为CSDN博主「日月同辉,与我共生」的原创文章,CSDN独一份。

目录

一、码元、波特率

1.1码元

1.2波特率

二、数据帧

2.1起始位

2.2停止位

2.3数据-帧头

三、系统设计

3.1设计要求

3.2系统原理

3.3硬件设计

3.3.1串口设计

3.3.2LED电路

3.4软件设计

3.4.1发送数据

3.4.2串口初始化

3.4.3接收中断

3.4.4定时器初始化

3.4.5定时器中断模块

3.4.6处接收数据理模块

四、结果

4.1发送两个字符串

4.2LED灯亮

4.3LED灯灭

一、码元、波特率

1.1码元

用相同时间间隔的符号来表示一个二进制数,一般来说,码元≠比特(1个二进制数相当于1个比特,用1bit表示),例如,有4种状态(0、1、2、3),分别用二进制数表示,即为00、01、10、11,因此1码元=2比特,特殊地,如果是2种状态(0、1),可以用0、1两个二进制数分别表示两种状态,此时1码元=1比特。在串口通信中,每次发送数据都是一个一个地发送,因此串口通信码元=比特

1.2波特率

单位时间内发送的码元数,称为波特率,单位为b/s。

我们常用9600b/s,每发送1比特需要的时间为1s/9600=104us

二、数据帧

2.1起始位

1位,表示一次通信的开始,给接收器时钟一个同步,告知接收端开始接收数据

2.2停止位

1位,一次通信的结束

2.3数据-帧头

串口通信帧头(也称为帧起始标志)是用来标识一个串口通信帧的开始位置的特殊字符。它的作用是让接收端能够正确地识别数据帧的开始位置,以便接收端能够正确地解析整个数据帧。帧头通常是一个固定的特定字符或字符组合

三、系统设计

3.1设计要求

本次设计,最开始,单片机com1发送Wait for Serial Communication Tset Start.和Please Send a string of data:这两个字符串到虚拟串口com3,然后由虚拟串口com3发送数据给单片机com1,单片机接收数据后能够重新发回给com3。发送的数据由帧头+数据组成,帧头为AA 55 AA 55,数据有2种情况,当数据为01 02时,接P1^0的LED灯亮,当数据为02 01时,接P1^0的LED灯灭,当数据错误时,LED灯无反应(已近亮了无法灭,已近灭的无法亮)。另外,虚拟终端能接收到单片机发送的数据。

3.2系统原理

串口发送数据不是一次性发送,而是一个一个字符/字节发送。波特率为9600b/s,发送一个比特需要时间要104us,定时器可以定时1ms,若是定时时间超过5ms(规定值,一般是3ms-8ms),则说明接收数据完成,因此可以定义定时计数变量recv_timer_cnt,该变量每+1,定时累加1ms,如果该变量值超过5,则定时超过5ms,则接收完成,每接收一个数据,定时计数变量recv_timer_cnt清0,接收的数据存储到数组recv_buf。

接收完成后要判断数据是否正确并对正确数据进行解析,可以设定一个帧头变量recv_move_index,判断数组recv_buf每一个数据是否正确,有错误的,跳出该判断,将帧头变量+1,然后继续重头判断,直到判断到正确的一串数据或结束,判断到正确的一串数据,就开始对数据进行解析(处理LED)。

3.3硬件设计

3.3.1串口设计

3.3.2LED电路

LED灯采用共阳极接法,左端接电源,右端先接电阻再接到P1^0。

3.4软件设计

3.4.1发送数据

void sendByte(unsigned char dat) //发送一帧数据功能函数
{
	SBUF=dat;
	while(!TI);
	TI=0;
}

void sendString(unsigned char *dat)//发送字符串函数
{
	while(*dat != '\0')
	{
		sendByte(*dat++);
	}
}

3.4.2串口初始化

void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xFD;			//设置定时初始值
	TH1 = 0xFD;			//设置定时重载值
	ET1 = 0;			  //禁止定时器中断
	ES=1;           //串口中断打开
	TR1 = 1;			  //定时器1开始计时
}

3.4.3接收中断

void ES_timers() interrupt 4 //接收中断
{
	if(RI)
	{ 
		RI=0; 
		start_timer=1;//1.开定时器标志位置1
    if(recv_cnt<MAX_REX_NUM)	//在规定字符长度范围内接收数据	
		{
			recv_buf[recv_cnt]=SBUF; //2.接收数据
			recv_cnt++; 
		}
		else
		{
			recv_cnt=MAX_REX_NUM;
		}
		recv_timer_cnt=0; //3.每接收一帧数据就计数清0
	}
}

3.4.4定时器初始化

void Timer0_Init(void)		//1毫秒@11.0592MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x66;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	ET0=1;          //定时器0中断打开
	TR0 = 1;				//定时器0开始计时
}

3.4.5定时器中断模块

void T0_timer() interrupt 1 //利用1ms计数,判断是否接收完成
{
	TR0=0;
	if(start_timer == 1)//软件定时器打开
	{
		recv_timer_cnt++;//计数加1
		if(recv_timer_cnt>MAX_timer_cnt) //计数值超过规定范围说明接收完成
	  {
		  recv_timer_cnt=0;//计数重新置0 
		  
		  recv_flag=1;//接收完成标志位置1
	  }
	}
	TL0 = 0x66;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TR0=1;
}

3.4.6处接收数据理模块

void uart_service(unsigned char *buf) //完成对接收正确性的判断及相应解析
{
	unsigned char recv_move_index;//帧头变量的定义
	if(recv_flag)//接收完成开始解析
		{
			start_timer=0;//接收完成要关闭软件定时器
			recv_flag=0;//接收完成标志位置0,以便下次接收
			sendString(buf);//发送接收缓冲区的数据
			while((recv_cnt>=6)&&(recv_move_index<=recv_cnt))//数据字节大于等于6,帧头不能超过数据字节
			{
				if((buf[recv_move_index+0]==0xAA)&&(buf[recv_move_index+1]==0x55)&&(buf[recv_move_index+2]==0xAA)&&(buf[recv_move_index+3]==0x55))
					    //满足帧头 AA 55 AA 55
				{
						if((buf[recv_move_index+4]==0x01)&&(buf[recv_move_index+5]==0x02))
							//帧头后数据为01 02时LED亮
						{
							LED=0;
						}
						if((buf[recv_move_index+4]==0x02)&&(buf[recv_move_index+5]==0x01))
							//帧头后数据为02 01时LED灭
						{
							LED=1;
						}
						break;//满足帧头和数据退出while循环
				}
				recv_move_index++;//帧头移动1位
			}
			recv_cnt=0;
            clr_recvbuffer(buf);//清除缓冲函数
		}
}

四、结果

4.1发送两个字符串

4.2LED灯亮

4.3LED灯灭

下一文将着重串口中断即时解析数据帧头的通信程序,亲爱的读者敬请期待,下一文更精彩!!!

一日不读书,胸臆无佳想。我叫不白吃,喜欢我的,可以支持我,博主名叫@日月同辉,与我共生

@日月同辉,与我共生_单片机基础,单片机串口通信-CSDN博客@日月同辉,与我共生擅长单片机基础,单片机串口通信,等方面的知识,@日月同辉,与我共生关注stm32,c语言,51单片机,proteus,单片机领域.https://blog.csdn.net/LIN___IT?spm=1000.2115.3001.5343

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1160729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序:两层循环的练习,两层循环显示循环图片大图(大图显示、多层循环)

效果 代码分析 外层循环 外层循环的框架 <view wx:for"{{info}}" wx:key"index"></view> wx:for"{{info}}"&#xff1a;这里wx:for指令用于指定要遍历的数据源&#xff0c;即info数组。当遍历开始时&#xff0c;会依次将数组中的每…

链表的结点个数统计及查找

链表节点个数统计 要统计链表中的节点个数&#xff0c;只需要遍历整个链表&#xff0c;并在遍历的过程中计数即可。具体实现代码如下&#xff1a;(仍然使用C#) 先定义一个整型函数(节点个数的返回值一定是整型变量) int getLinkNodeNum(struct Test *head) {int cnt 0;whil…

STM32:AHT20温湿度传感器驱动程序开发

注&#xff1a;温湿度传感器AHT20数据手册.pdf http://www.aosong.com/userfiles/files/AHT20%E4%BA%A7%E5%93%81%E8%A7%84%E6%A0%BC%E4%B9%A6(%E4%B8%AD%E6%96%87%E7%89%88)%20B1.pdf 一、分析AHT数据手册文档 (1).准备工作 1.新建工程。配置UART2 2.配置I2C1为I2C标准模式&…

数据链路层中存在的报文ip,arp,rarp

IP数据报 ARP请求/应答报 RARP请求/应答报 IP数据报 这里的目的地址和源地址是MAC地址。 这个被称为 MAC 地址&#xff0c;是一个网卡的物理地址&#xff0c;用十六进制&#xff0c;6 个 byte 表示。 MAC 地址是一个很容易让人误解的地址。因为 MAC 地址号称全球唯一&…

深度学习_7_实战_点集最优直线解_优化版代码解析

完整版优化代码&#xff1a; import torch from torch.utils import data from d2l import torch as d2l # 特定导入 from torch import nndef load_array(data_arrays, batch_size, is_trainTrue):dataset data.TensorDataset(*data_arrays) #解包传递&#xff0c;转成张量…

【Linux】Nignx的入门使用负载均衡前端项目部署---超详细

一&#xff0c;Nignx入门 1.1 Nignx是什么 Nginx是一个高性能的开源Web服务器和反向代理服务器。它使用事件驱动的异步框架&#xff0c;可同时处理大量请求&#xff0c;支持负载均衡、反向代理、HTTP缓存等常见Web服务场景。Nginx可以作为一个前端的Web服务器&#xff0c;也可…

使用docker进行nextcloud+onlyoffice环境搭建(在线 or 离线)

1.安装 MySQL&#xff08;有MySQL就可以不装&#xff09; docker run -itd --name mysql8.0 -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot --restartalways -e TZ"Asia/Shanghai" -v /home/docker/workspace/mysql:/var/lib/mysql mysql:latest --lower_case_table_na…

【案例】3D地球

效果图&#xff1a; 直接放源码 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><meta name"viewport" content"initial-scale1.0, user-scalableno" …

用Python实现批量下载文件——代理ip排除万难

目录 前言 一、准备工作 二、批量下载文件 三、添加代理ip 四、处理异常 完整代码 总结 前言 下载文件是我们在日常工作中常常要做的一件事情。当我们需要从互联网上批量下载大量文件时&#xff0c;手动一个一个去下载显然不够高效。为了解决这个问题&#xff0c;我们可…

Unity内打开网页的两种方式(自带浏览器、内嵌浏览器)

1.自带浏览器 这个比较简单&#xff0c;直接调用unity官方的API即可&#xff0c;会直接使用默认浏览器打开网页&#xff0c;这里就不多做解释了。 代码 public InputField input;private void OpenUrlByUnity(){string inputStr input.text;if (!string.IsNullOrEmpty(input…

JVM虚拟机:你是如何理解Java中的垃圾?

什么是垃圾&#xff1f; 垃圾就是内存中不再被使用到的空间&#xff0c;当一个对象不再被引用后那么久成为垃圾可以回收了&#xff0c;但是线程计算没有引用也可以独立运行&#xff0c;因此线程和对象不同。如果一个对象没有任何一个引用指向它了&#xff0c;那么这个对象就是…

什么是Web 3.0?

什么是Web 3.0&#xff1f;简而言之&#xff0c;就是第三代互联网。 在回答Web 3.0之前&#xff0c;让我们先看一下Web 1.0和Web 2.0。 互联网革命 Web 1.0&#xff0c;第一代互联网&#xff0c;从互联网诞生到1997年。 在Web 1.0&#xff0c;互联网的信息是静态的只读网页&a…

MySQL 配置文件添加参数后服务起不来了

如何正确地向数据库添加配置参数。 作者&#xff1a;王雅蓉&#xff0c;DBA&#xff0c;负责 MySQL 日常问题处理和 DMP 产品维护。 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 本文约 1000 字&#xff0c;预计阅读需…

CFCA国产SSL证书

随着国潮风的兴起和中国自主技术的发展&#xff0c;很多组织单位对网络信息安全产品的需求逐渐倾向国产化。在SSL证书需求方面也有很多的组织单位更倾向于国产SSL证书。今天&#xff0c;我们就先来侧重介绍一下国产SSL证书CFCA的相关特点。 CFCA国产SSL证书 CFCA拥有国家多项认…

linux jdk配置

1.下载jdk &#xff0c;以jdk1.8为例子 Java Downloads | Oracle JDK 8 Update Release Notes (oracle.com) 2.配置环境变量 1.下载相关jdk版本&#xff0c;执行以下命令安装jdk tar -zxvf jdk-8u144-linux-x64.tar.gz 2.编辑命令 vi /etc/profile 3.在最后加入下面配置 e…

完美解决:Nginx安装后,/etc/nginx/conf.d下面没有default.conf文件

目录 1 问题&#xff1a; 2 解决方法 方法一&#xff1a; 方法二&#xff1a; 3 查看 1 问题&#xff1a; /etc/nginx/conf.d下面没有default.conf文件。 2 解决方法 方法一&#xff1a; 自己创建default.conf文件。 vi /etc/nginx/conf.d/default.conf 添加如下内容&…

overflow溢出属性、定位、前端基础之JavaScript

overflow溢出属性 值 描述 visible 默认值。内容不会被修剪&#xff0c;会呈现在元素框之外。 hidden 内容会被修剪&#xff0c;并且其余内容是不可见的。 scroll 内容会被修剪&#xff0c;但是浏览器会显示滚动条以便查看其余的内容。 auto 如果内容被修剪&#xff0…

【算法挑战】设计一个支持增量操作的栈(含解析、源码)

1381.设计一个支持增量操作的栈 https://leetcode-cn.com/problems/design-a-stack-with-increment-operation/ 1381.设计一个支持增量操作的栈 题目描述方法 1: 用数组或链表模拟栈 数组复杂度分析链表复杂度分析代码 方法 2: 空间换时间 图解复杂度分析代码 题目描述 请…

企业服务总线ESB有什么作用?和微服务有什么区别?会如何发展?

企业服务总线ESB是什么 下面这张图&#xff0c;稍微了解些IT集成的朋友应该不陌生。 随着信息化发展不断深入&#xff0c;企业在不同的阶段引入了不同的应用、系统和软件。这些原始的应用系统互不连通&#xff0c;如同一根根独立的烟囱。 但是企业业务是流程化的&#xff0c;…

Vue入门——核心知识点

简介 Vue是一套用于构建用户界面的渐进式JS框架。 构建用户界面&#xff1a;就是将后端返回来的数据以不同的形式(例如&#xff1a;列表、按钮等)显示在界面上。渐进式&#xff1a;就是可以按需加载各种库。简单的应用只需要一个核心库即可&#xff0c;复杂的应用可以按照需求…