串口中断(9)即时解析用户自定义通讯协议--接收数据固定情况

深入解析P89LPC924/925:高性能80C51内核与高集成度外设实战 在嵌入式系统开发中,微控制器(MCU)是核心处理单元,其架构与性能直接决定了系统的实时性、功耗与成本。80C51内核作为经典架构,通过优化指令执行周期(如从12周期缩减至2-4周期)实现了性能的显著提升,这为实时控制应用提供了坚实的算力基础。这种高性能内核结合丰富的片上外设(如ADC、I2C、UART),构成了高集成度MCU的核心价值,能够大幅减少外部元件,降低系统BOM成本与PCB面积。本文以Philips(现NXP)的P89LPC924/925为例,深入探讨其增强型80C51内核的实现原理、外设配置技巧 阅读详情

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

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

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

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

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

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

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

6fc58cb779cf4b1abfd70ea313d654a5.png

目录

一、系统设计要求

二、系统设计原理

三、硬件设计

3.1串口设计

3.2LED电路设计

3.3蜂鸣器设计

四、软件设计

4.1串口初始化

4.2接收中断

4.3定时器T0初始化

4.4定时器中断

4.5发送数据函数

4.6主程序

4.7uart.h

五、结果展示

5.1控制LED

5.2控制蜂鸣器

六、效验软件推荐

一、系统设计要求

虚拟终端com1发数据给单片机com1,接收后将数据重新发给com3。

com3发送到数据:帧头(1、2帧)+数据类型(3帧)+数据块(4、5帧)+效验位(6、7帧)

帧头:共2帧,55 AA   

数据类型:共1帧,01时控制LED灯,02时控制蜂鸣器

数据块:共2帧,第一帧为高8位,第二帧为低8位,两帧合并为16位2进制,用于控制LED亮/蜂鸣器发声时间。

效验位:共2帧,第一帧为和效验,第二帧为异或效验。

com1将数据重新的数据:发送到数据不是将接收到的数据全部发送给com3,而是第3-5帧数据发送给com3。

二、系统设计原理

本次实验采取"边接收边处理式"的思路。

由于串口通信是一帧一帧接收的,所以我们可以每接收一帧就判断帧头数据的正确性。

至于com1要重新发送的数据,可以定义一个数组recv_buf用于存储com1要发送的数据。

使用switch-case语句,分支0、1,分别判断帧头数据55和AA后,进入下一个分支。

分支2接收类型+代码快(共3帧),并将3帧存储到数组recv_buf,同时定义两个专门计算效验值的变量(和效验变量sum_check和异或效验变量xor_check),在分支2中计算出第3-5帧的和效验值、异或效验值。

然后进入分支3、4,用于判断计算出的和效验、异或效验值是否与接收到效验帧数据相同。如果和效验和异或效验位正确,则接收完成标志位recv_flag置1,代表接收数据完成且正确 。

主程序中,在recv_flag==1的基础上进行,根据类型数据帧,采用switch-case语句分别处理LED/蜂鸣器。

持续时间:高8位左移8位+低8位

LED发亮持续时间:led_data=recv_buf[1]<<8+recv_buf[2];

蜂鸣器发声时间:beep_data=recv_buf[1]<<8+recv_buf[2];

注:recv_buf[0]是数据类型,recv_buf[1]是高8位,recv_buf[2]是低8位。

三、硬件设计

3.1串口设计

com1发送端TXD接com2发送端TXD,com1接收端RXD接com2接收端RXD。

虚拟终端RXD接TXD(因为单片机发送数据给com3,而虚拟终端可以理解为虚拟串口com3)。

d530f4a2d47647dbb61a93cd7d44fab1.png

3.2LED电路设计

LED灯采用共阳极接法,左端接电源(高电平1),右端通过电阻接P1^0,P1^0低电平时,LED导通,发亮;P1^0高电平时,LED不导通,不亮(熄灭)。

5086ca43e8d248269ac4b0f196b9d4ec.png

3.3蜂鸣器设计

R2右端接到P1^7,P1^7为低电平时,三极管导通,+5V电源(提供电压电流的作用)与蜂鸣器连接,蜂鸣器正极为高电平;P1^7为高电平,三极管不导通,蜂鸣器正极为低电平。

4b3aaaa7758a4a07bf8557137f7c498b.png

四、软件设计

4.1串口初始化

波特率9600b/s,晶振频率为11.0592Mhz,串口工作方式1(8位异步通信,波特率可变),定时器T1的工作方式2(8位自动重载)。

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开始计时
}

4.2接收中断

帧头判断55 AA==>将3帧(1帧类型+2帧数据块),计算和效验值、异或效验值==>判断和效验、异或效验是否正确==>正确则接收完成标志位recv_flag置1。

不直接用数组recv_buf来存储接收数据,因为recv_buf存储的数据用于发送给com3,而单片机只将一部分数据发送给com3,不能将接收到的数据全存储到recv_buf。需要定义recv_data(中间值),用于接收com3发来的数据。

void ES_timers() interrupt 4 //接收中断
{
	static unsigned char machine_step=0;//分支变量
	static unsigned char sum_check;//和效验
	static unsigned char xor_check;//异或效验
	if(RI)
	{ 
		RI=0; //RI清0
		recv_data=SBUF;//接收数据
		switch(machine_step)
		{
			case 0:
				 if(recv_data==0x55)//帧头:55
				 {
					 machine_step=1;
				 }
				 else
				 {
					 machine_step=0;
				 }
				break;
			case 1:
				 if(recv_data==0xAA)//帧头:AA
				 {
					 machine_step=2;
					 recv_cnt=0;
				 }
				 else
				 {
					 machine_step=0;
				 }
				break;
			case 2:
				 recv_buf[recv_cnt]=recv_data;//将单片机com1要发送到数据存储到数组recv_buf
				 recv_cnt++;
				 sum_check+=recv_data; //计算和效验
				 xor_check^=recv_data; //计算异或效验
				 if(recv_cnt>2) //存储完3个数据(类型01/02+代码快)后进入下一分支
				 {
					 machine_step=3;
				 }
				 else
				 {
					 machine_step=2;
				 }
			   break;
			case 3:
				 if(sum_check==recv_data) //和效验正确
				 {
					 machine_step=4;
				 }
				 else
				 {
					 machine_step=0;
				 }
			   break; 
			 case 4:
				 if(xor_check==recv_data) //异或效验正确
				 {
					 recv_flag=1;//接收正确
						
				 }
				 machine_step=0;
				 sum_check=0;//和效验变量清0
				 xor_check=0;//异或效验变量清0
				 recv_cnt=0;
			   break; 			
			 default:break;		 
		}
   }
}

4.3定时器T0初始化

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

4.4定时器中断

void T0_timer() interrupt 1 //利用1ms计数,判断是否接收完成
{
	    TR0=0;
		if(led_cnt<led_data)//LED发亮
		{
			LED=0;
			led_cnt++;
		}
		else //LED灯灭
		{
			LED=1;
		}
		if(beep_cnt!=0) //蜂鸣器发声
		{
			Beep=~Beep;
			beep_cnt--;
		}
	    TL0 = 0x66;				//设置定时初始值
	    TH0 = 0xFC;				//设置定时初始值
	    TR0=1;
}

4.5发送数据函数

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

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

4.6主程序

#include <reg51.h>
#include "uart.h"

void Timer0_Init(); //定时器0函数声明

sbit LED=P1^0;//位定义
sbit Beep=P1^7;

void main()
{
	UartInit();     //调用串口初始化函数
	Timer0_Init();
	EA=1;           //总中断允许
	while(1)
	{
		if(recv_flag==1)//接收完成
		{
			recv_flag=0;
			sendString(recv_buf);//发送缓冲区数据
			switch(recv_buf[0])//根据类型判断对LED处理还是蜂鸣器处理
			{
				case 0x01:
					led_data=recv_buf[1]<<8;//高8位recv_buf[1]左移8位
					led_data=led_data+recv_buf[2];//计算LED控制时间
					led_cnt=0;
					break;
				case 0x02:
					beep_data=recv_buf[1]<<8;//高8位recv_buf[1]左移8位
					beep_data=beep_data+recv_buf[2];//计算蜂鸣器控制时间
					beep_cnt=beep_data;
					break;
				default:clr_recvbuffer(recv_buf);//清除缓存
				break;	
			}
		}
	}
}

4.7uart.h

#ifndef __UART_H__
#define __UART_H__

#include <reg51.h>
#include <stdio.h>

#define MAX_REX_NUM 20
#define MAX_timer_cnt 5

extern unsigned char recv_buf[MAX_REX_NUM];
extern unsigned char recv_cnt;
extern unsigned char start_timer;
extern unsigned char recv_timer_cnt;
extern unsigned char recv_flag;
extern unsigned int led_data;
extern unsigned int beep_data;
extern unsigned int led_cnt;
extern unsigned int beep_cnt;

void UartInit(void);
void sendByte(unsigned char dat);
void sendString(unsigned char *dat);
char putchar(char c);
void clr_recvbuffer(unsigned char *buf);

#endif

五、结果展示

5.1控制LED

com3发送给com1的数据:55 AA 01 20 20 41 01

com1重新发回给com3的数据:01 20 20

结果:LED亮2020ms,2020ms后灭。

c7a62e12be0b478ca077b210ca92f679.png

e4922b820c124eedb1ef586a15da24ec.png

5.2控制蜂鸣器

com3发送给com1的数据:55 AA 02 20 20 42 02

com1重新发回给com3的数据:02 20 20

结果:蜂鸣器发声2020ms,2020ms后停止发声。

855db8ca351b49368636bf5dc079fb3a.png

 

cfaf9f643bfc44adb59cd93c79ee8c16.png

六、效验软件推荐

为方便读者们学习串口通信,为大家推荐效验计算工具。

链接:

异或校验/BCC校验计算-ME2在线工具 (metools.info)

efec006f52274022b2e648d12348a47e.png

5f9e2d7f48cc4eab92c1302d326b0a9d.png

亲爱的读者敬请期待,下一文更精彩!!!

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

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

 

 

STM32毕设实战:从选题到答辩的完整避坑指南 嵌入式开发中,定时器、GPIO与串行通信是绕不开的基础模块,它们共同构成STM32等MCU项目的外设核心。以定时器输入捕获为例,通过计数器差分与预分频设置即可精确测量频率;而按键电路的上拉电阻与消抖设计,则直接影响系统稳定性。这些原理既是毕设作品的功能基石,也是工程调试的关键节点。从环境搭建到模块联调,从LVGL界面移植到K210视觉协同,再到PID参数整定,各类实战问题往往源于对底层机制的深入理解。本文结合常见开发痛点,梳理STM32毕设从选题、外设驱动到烧录排错的完整路径,帮助学习者在动手实践中建立系统 阅读详情

相关推荐

自定义串口数据通信协议的分析与设计

以微软公司的MSComm串口通信控件为底层接口,建立了一个简单的串口通信协议(SPCP)。SPCP协议的设计基于帧传输的思想,采 用发送 应答 重连 失败的方式进行。利用该协议能实现双机短信聊天、文件传输等实时数据通信功能。 / / /

STM32F030R8Tx自定义协议实现串口升级详解

基于STM32F030R8Tx为例来剖析串口升级,本例程分为三个部分 STM32应用程序部分 STM32 bootloader部分 上位机串口通信分发升级包部分 上位机与STM32之间的串口数据通信协议约定 包头 包长度 命令 0~n字节数据 校验和 0xff 0x** 0x** 0x**....0x** 0x** 校验和计算方法 从包头开始到校验和之前的所有数据累加和,取低8位...

mygod2008ok的专栏 3275

STM32入门教程:WiFi通信

STM32是一款强大的嵌入式系统开发平台,可以用于开发各种应用程序,包括WiFi通信。在本教程中,我们将介绍如何使用STM32开发板和WiFi模块进行无线通信。以下是一个详细的代码案例,涵盖了WiFi通信的基本概念和实现。

qq_67153941的博客 1348

7.串口通信uart编写思路及自定义协议

*更改变量 BEGIN-- *///引入该.h可使用//引入该.h可使用//引入该.h可使用//从索引2开始赋值/*更改变量 END-- */协议头0x2c,0x12协议尾0x5b,想要让协议数据位变多,只需要修改变量RxBuffer1[]的定义即可//解析接收的数据 最多11哥,两个帧头,一个帧尾,其他是数据位uint8_t i;//计数u8 pi=0;//打印调试if(RxState==0&&com_data==0x2C) //0x2c帧头 RxCounter1==1。

weixin_62622990的博客 2667

深信服AC1000-B1200到手第一步:从开箱到激活上网的保姆级图文指南

本文提供深信服AC1000-B1200企业级行为管理设备的详细开局使用指南,涵盖从开箱验机、物理连接到网络配置、安全加固及设备激活的全流程。通过图文并茂的步骤解析,帮助用户快速完成设备初始化并实现安全上网,特别适合初次接触该设备的网络管理员参考。

weixin_42546392的博客 545

[RK3588从入门到精通] 专栏目录及介绍

[RK3588从入门到精通] 专栏目录及介绍

nb124667390的博客 6495

串口、网口等自定义通信协议的问题

通信协议分为串口、网口

m0_54711064的博客 2622

Box2D-Lite源码阅读笔记(2)

0.初始化函数 static void InitDemo(int index) { world.Clear(); numBodies = 0; numJoints = 0; bomb = NULL; demoIndex = index; demos[index](bodies, joints); } 在这个初始化函数中,一般会默认执行index=0的函数,这个函数就是一个示例,因为示例比较简单,所以也便于研究,示例效果如下。 就是一个方块。 进入第一个示例函数。(忽略我加的注释)

ARTELE的博客 975

串口通信协议RS232

​串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节的通信方式。尽管串行通讯的比按字节传输的并行通信慢,但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。​由于串口通信是异步的,所以端口能够在一根线上发送数据同时在另一根线上接收数据。简单的解释就是:两个人说话,一个人说,一个人听。串口通信最重要的参数是端口(com)、波特率、数据位、停止位和奇偶的校验。对于两个需要进行串口通信的端口,这些参数必须匹配,共同遵守,这也是能够实现串口通讯的前提。

悦分享 3万+

【华为OD机试真题 新系统】959、 水库溃坝填补 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025C卷】959、 水库溃坝填补 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华

KJ.JK 2932

redhawk:avgTW maxTW minTW minWC的区别

分析dynamic ir drop报告时会遇到这几个值,avgTW maxTW minTW minWC,如下图。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 691

自定义串口通信协议,如何实现?

关注+星标公众号,不错过精彩内容作者 | strongerHuang微信公众号|嵌入式专栏有一些初学者总觉得通信协议是一个很复杂的知识,把它想的很高深,导致不知道该怎么学。同时,偶尔有...

strongerHuang 9588

PCL 提取两片点云的非重叠部分【2025最新版】

PCL 提取两片点云的非重叠部分。博客长期更新,本文最近一次更新时间为:2025年9月1日。

点云侠的博客 36万+

MSP430 GPIO深度解析:从端口复用到施密特触发器实战

通用输入输出(GPIO)是微控制器(MCU)连接外部世界的基础接口,其核心在于将内部数字信号与外部物理世界进行可靠交互。其工作原理涉及方向控制、数据锁存及信号整形等关键环节。在工程实践中,GPIO的技术价值体现在其灵活的可配置性与强大的抗干扰能力,这直接决定了嵌入式系统的稳定性和可靠性。典型的应用场景包括传感器数据采集、人机交互控制以及各类执行器驱动。本文聚焦于德州仪器MSP430系列MCU的GPIO系统,深入剖析其**端口复用**机制如何实现有限引脚的多功能拓展,并详解内置**施密特触发器**的电路原理及

weixin_30516243的博客 453

YOLOv11涨点改进 | NeurIPS2025最佳论文!注意力改进篇| 引入Gated Attention门控注意力模块、太牛了!直接拯救了大模型的发展,助力目标检测、图像分割、图像分类有效涨点

本文提出了一种基于门控注意力机制(GatedAttention)的YOLOv11改进方法。该模块通过在标准注意力机制中引入头部特定的sigmoid门控,有效提升了模型性能和训练稳定性。实验表明,GatedAttention能够增强模型对关键信息的聚焦能力,减少无关区域关注,提高检测精度。同时,门控机制带来的非线性和稀疏性优化了计算效率,并缓解了训练不稳定性问题。文章详细介绍了模块原理、实现代码及三种改进方案配置方法,为YOLOv11在复杂场景下的目标检测提供了有效解决方案。

Ai缝合怪、助力小伙伴高效发论文 495

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Linux 基础

第一句:定义了组成100ask_led模块的对象文件列表。第二句:编译成一个可加载的内核模块。最终将三个.o文件编译成一个.ko文件内核构建系统会根据。

2301_79302469的博客 781

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【嵌入式STM32】SPI总结

在大容量产品和互联型产品上,SPI接口可以配置为支持SPI协议或者支持2S音频协议。SPI接口默认工作在SPI方式,可以通过软件把功能从SPI模式切换到I2S模式。注意在小容量和中容量产品上,不支持I2S音频协议。通讯引脚SCK引脚:SPI1/SPI2/SPI3芯片手册中告知,最大速率18Mbps。NSS引脚:有两种NSS模式,软件和硬件。软件模式即可以用指定的GPIO来进行从设备片选。一般采用这种模式。MISO/MOSI引脚:数据收发引脚,通过一个数据寄存器(DR)进行收发控制。

hao1183716597的专栏 1423

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

STM32小白视角笔记(标准库)(乱序版)

本文介绍了小白视角下的STM32学习的基本操作与应用

obsidian_1_的博客 432

串口中断(10)自定义通讯协议-协议带数据长度及接收应答处理

串口通信+自定义通讯协议+正确/错误接收应答+协议带数据长度+数码管显示 (免费代码提供+免费仿真图提供)

LIN___IT的博客 2453

通过定时器Timer方式实现串口通信及led灯闪烁

STM32f103系列一共有8个16位的定时器; 其中分为基本定时器、通用定时器和高级定时器; 这些定时器使STM32具有定时、信号的频率测量、信号的PWM测量、PWM输出、三相6步电机控制及编码器接口等功能,适用于工业控制领域。

qq_59184121的博客 1580

带协议解析的串口调试助手

软件下载地址: 链接:https://pan.baidu.com/s/1aBOw5xsPQVErVes4QO8XfA 提取码:suk0 软件功能简介 基本功能: ①每次打开软件自动扫描可用串口并添加到串口名列表中,也可在菜单”串口基本设置”里手动刷新串口列表. ②波特率提供了9600和115200两个常用选项. ③可调节 数据位(8,7)、校验位(无,奇,偶)、停止位(1,2) ...

ke的博客 1万+

STM32 串口接收数据包(自定义帧头帧尾)

/ 接收相关变量(usart.c中定义,需通过usart.h extern导出供其他文件使用)// 接收缓冲区,存储4字节定长数据段// 接收完成标志:0=未完成,1=完成(用于主函数判断是否处理数据)// 接收索引:记录当前接收数据在rxd_buf中的位置// 发送相关变量(示例用,可根据需求修改)// 默认发送数据包(仅示例)

C++,Java,Python,C#编程选手,偶尔刷刷leetcode 1462

自定义通信协议(实用)

自定义通信协议(实用) 现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。其中就涉及到通信的过程。在实际制作的几个设备中,笔者总结出了通信程序的通用写法,包括上位机端和下位机端等。 1.自定义数据通信协议   这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。在这个层面上

ArthurBruin‘s Blogs 6008

#C51串口通讯4-#一串数据#中断即时解析用户自定义协议(握手接收应答)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例

weixin_43612628的博客 1545

串口通信及中断

异步通信以帧为单位传送数据,由于每帧数据都具有起始位和停止位所以两帧数据之间的间隔时间不影响数据传送和接收的准确率,但是每帧数据内的各个二进制位间是以固定时间间隔传输的,即每个二进制位都有固定的传输速率,这个速率即为比特率,当一个码元仅表示0和1两种状态时(通信中常用时间间隔相同状态来表示一个二进制数字,这样的信号称为码元,而波特率表示每秒钟传输了多少个码元),一个码元等于一个二进制比特位,此时波特率与比特率大小相同,若是发送和接收双方的波特率不同,则会导致数据出现偏差。:收发双发只能实现数据单向传输。

hushichuanren的博客 4128

UART自定义通信协议代码实现方法

关注+星标公众号,不错过精彩内容作者 | strongerHuang微信公众号|strongerHuang我们学习单片机,首先接触的可能是点灯(GPIO),再次就是串口(UART)。串口是常用的一种通信接口,也是学嵌入式必备掌握的一项知识,但我发现有很多小伙伴只知道用串口输出或者打印一些数据,却不知道如何用串口进行数据传输和通信。这里就给大家分享一下串口通信协议、自定义通信协议,以及实现的原理...

strongerHuang 1494
上一篇: 串口通信(3)-接收一组固定长度的数据
下一篇: 串口中断(10)自定义通讯协议-协议带数据长度及接收应答处理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值