关于51单片机串口1发送完整的数据包

article/2025/10/14 18:57:04

关于51单片机串口1发送完整的数据包

在这里插入图片描述
在参考这样的协议的条件下我们想发送一套完整的数据包该如何发送呢?可以设计这样的程序。
1. 串行口1接收特定包头数据包函数。
参数: Uart_Rec_Data:串口接收到的数据 ; USER_Get_DataPacket: 数据存储目标数组。
返回: 0:未接收到完整的数据包; 1:接收到完整的数据包。
注:数组 USER_Get_DataPacket[2] 代表的是数据段的长度,通过【 数据段长度 + (地址,命令,数据长度标记码以及校验码的个数之和)= 数据包位的总个数】 及可判断数据包是否完整。


static uint8_t USER_Uart_1_Receive_DataPacket(uint8_t Uart_Rec_Data, uint8_t *USER_Get_DataPacket)
{static uint8_t DataPacket_Sequence = 0; //定义数据包顺序静态变量并赋值为“0”static uint16_t i = 3;                  //定义数据包存储位置静态变量并赋值为“3”switch (DataPacket_Sequence){case 0:if (Uart_Rec_Data == 0x01) //判断数据包第0个数据{DataPacket_Sequence = 1;                //跳转到下一个步骤USER_Get_DataPacket[0] = Uart_Rec_Data; //将数据包第0个数据存入数组第0位}elseDataPacket_Sequence = 0; //维持在本步骤break;case 1:if (Uart_Rec_Data == 0x03) //判断数据包第1位数据{DataPacket_Sequence = 2;                //跳转到下一个步骤USER_Get_DataPacket[1] = Uart_Rec_Data; //将数据包第1个数据存入数组第1位}elseDataPacket_Sequence = 0; //跳转到第0步骤break;case 2:USER_Get_DataPacket[2] = Uart_Rec_Data; //将数据包中表示有效数据个数值存入数组第2位DataPacket_Sequence = 3;                //跳转到下一个步骤break;case 3:USER_Get_DataPacket[i] = Uart_Rec_Data; //将数据包中有效数据存入数组第i位i++;if (i >= (USER_Get_DataPacket[2] + 5)) //判断接收有效数据个数是否完成//{i = 3;                   //数据包存储位置变量重新赋值为“3”DataPacket_Sequence = 0; //跳转到第0步骤return 1;                //接收到完整的数据包}break;default:break;}return 0; //未接收到完整的数据包
}

2. MCU外设异步串行通信口Uart_1中断服务函数。
对串口1是否接收到数据进行判断以及对数据进行读取。


void MCU_Uart_1_Isr() interrupt 4
{uint8_t Uart_1_R_Data = 0; //定义串行口1数据接收缓存器数据读取变量并赋值为“0”if (RI)                    //判断串行通信口Uart_1是否接收到数据{RI = 0;               //清除串行通信口Uart_1接收数据标志位RI清“0”Uart_1_R_Data = SBUF; //读出串行通信口Uart_1数据缓冲器数据MCU_Uart_1_Receive_Finsh = USER_Uart_1_Receive_DataPacket(Uart_1_R_Data, MCU_Uart_1_Get_DataPacket);}
}

3. 主函数。
通过对相关IO口以及串口1进行初始化,循环对数据包的完整性进行判断,若数据包完整则通过串口1发送出去,并对标志位进行清0。

int main(void)
{uint8_t xdata i = 0;			   //定义变量i并赋值为“0”MCU_GPIO_All_Init();			   //MCU 所有I/O口初始化为准双向口模式函数MCU_Uart_1_Init_Isr(0, 2, 115200); //P3.0/RxD, P3.1/TxD   12分频定时/计数器T2   115200bpswhile (1) //死循环{/*********************测试串行口1接收数据包******************************/if (MCU_Uart_1_Receive_Finsh) //判断串行口1是否接收到完整数据包{MCU_Uart_1_Send_DataPacket(MCU_Uart_1_Get_DataPacket, MCU_Uart_1_Get_DataPacket[2] + 5); //将数据包通过串行口1发送出去MCU_Uart_1_Receive_Finsh = 0;															 //串行口1接收到完整数据包标志位清"0"}}
}

4. 测试
编译以及烧录成功后用串口助手对串口进行测试!
在这里插入图片描述
如上图所示,若发送缓冲区发送数据包不完整,则接收缓冲区接收不到串口1所发来的数据包。
在这里插入图片描述
同理,若数据包发送完整,即可接收到串口1所发来的数据包。
测试完毕,证明该程序是可行的。


http://chatgpt.dhexx.cn/article/NmraKTux.shtml

相关文章

51单片机串口收发

#include<reg52.h>#define uint unsigned int #define uchar unsigned char/*本代码实现串口的收发功能&#xff0c;PC发送什么单片机就接收什么&#xff0c; 然后单片机又把接收的发出去&#xff0c;本次编写了在发送单个字符串 函数上添加了字符串函数&#xff0c;方便…

学习51单片机串口工作方式及应用

1.串口控制寄存器SCON SM2:多机通信控制位 REN:允许接收控制位 TB8:发送第九位数据 RB8:接收第九位数据 TI:发送中断标志位 RI:接收中断标志位 2.电源控制寄存器PCON 当SMOD位为1&#xff0c;则串行口方式1、方式2、方式3的波特率加倍。 3.串口的工作方式 &#xff08;1…

关于51单片机串口通信的相关知识(寄存器)

一、51单片机串口概念 1、51单片机的串行口 51单片机的串行口是一个可编程全双工的通信接口&#xff0c;具有UART&#xff08;通用异步收发器&#xff09;的全部功能。 2、51单片机的硬件连接 简单双向串口通信有两根数据通信线&#xff1a; 发送端TXD&#xff08;Transmit Da…

C51单片机串口点亮一个led

C51单片机串口点亮一个led 因为最近要用到51的串口做一些通信&#xff0c;这里写一个点led的程序记录一下。 说是一个led&#xff0c;其实可以随意多个。 主要使用到的东西&#xff1a; STC89C52芯片&#xff0c;USB转TTL下载器&#xff0c;led灯若干&#xff0c;面包板&am…

51单片机 串口

串口说白了&#xff0c;就是初始化后&#xff0c;用中断接收发送字符而已。 TXD 是 80C51 单片机的P3.1口&#xff0c;RXD 是80C51 单片机的 P3.0口 T1 溢出率 是定时器1的溢出率 &#xff0c;SMOD是发送速率倍频的16分频&#xff0c;T1每溢出一次发送一位&#xff0c;每次发送…

【记录】一次51单片机串口乱码问题排查

【记录】一次51单片机串口乱码问题排查 项目场景问题描述原因分析解决方案结语 项目场景 在51串口收发仿真实验中使用两个单片机互相通信&#xff0c;程序设定A上电1s后通过串口以16进制给B发送AA,直到B收到AA后回复BB&#xff0c;当A机确认收到AA后开始发送数据&#xff0c;若…

## 51单片机串口通讯

1&#xff0c;接线方式&#xff1a; RXD: 数据输入引脚&#xff1b;对应stc89的P3.0口&#xff1b; TXD&#xff1a;数据的发送端口;对应P3.1口&#xff1b; 注意&#xff1a;单片机的的串口TX&#xff0c;RX与外设交叉接线&#xff1b; 2串口编程要素 输出/输入数据缓冲器S…

51单片机串口通信详解

文章目录 前言一、计算机通信简介二、串口通信简介1、简介2、同步通信和异步通信2.1 同步通信2.2 异步通信 3、串行通信的传输方式4、串口通信硬件电路5、常见接口介绍 三、串口相关寄存器详解1、特殊功能寄存器SCON2、PCON寄存器3、TMOD寄存器&#xff08;定时器工作方式寄存器…

51单片机串口接收处理

目的: 通过51单片机串口外设功能&#xff0c;来对一组数据进行处理&#xff0c;新手刚刚入门可能会将串口接收到的一个数据直接赋值给一个变量&#xff0c;然后用这个变量做相应功能&#xff0c;可是这样写的不稳定性太高了&#xff0c;有可能会接收不到你要的那个数据&#…

51单片机串口通信原理

计算机串行通信基础 通信有串行通信和并行通信两种方式 串行通信&#xff1a; 将数据字节分为一位一位的形式在一条数据线上逐个传送。如下图所示 串行通信特点&#xff1a;传输线少&#xff0c;长距离传送时成本低&#xff0c;且可以利用电话网等现成设备&#xff0c;但数据的…

51单片机串口点灯

#include "reg52.h" #include "intrins.h" sfr AUXR 0x8e; sbit D5 P3^7; //定义led 接在P3.7void UartInit(void) //9600bps11.0592MHz {SCON 0x50; //配置串口工作方式1&#xff0c;RE使能接收数据 0101 0000PCON 0x00; TMOD &0x0F;TMOD |0x2…

51单片机串口使用

文章目录 前言一、串口概念二、中断中的RI、TI和SUBF1.RI2.TI3.SUBF 三、串口波特率的计算四、代码的编写总结 前言 今天将为大家讲解51单片机的串口原理及代码编写。 一、串口概念 51单片机串口是一种通信接口&#xff0c;它可以将51单片机与外部设备连接起来&#xff0c;实…

51单片机串口通信

串口通信 1、通信的基本概念2、 51单片机串口介绍2.1、串口通信简介2.2、串口内部结构2.3、串口通信寄存器SCONPCON 2.4、串口工作方式 3、串口使用方法3.1、硬件3.2、通信协议RS2323.3、串口初始化 4、硬件设计5、 软件设计6、拓展 串口的通信&#xff0c;一般是检测通信模块是…

UART串口通信

什么是串行通信? 将数据字节分成一位一位的形式在一条传输线上逐位地发送。 优点:成本低,控制复杂。 什么是异步通信? 异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。 异步通信的两…

MCU-51:单片机串口详解

目录 一、计算机通信简介二、串口通信简介2.1 同步通信2.2 异步通信 三、串行通信的传输方式四、串口通信硬件电路五、常见接口介绍六、串口相关寄存器详解6.1 特殊功能寄存器SCON6.2 PCON寄存器6.3 TMOD寄存器 七、代码演示-单片机和电脑通信7.1 串口向电脑发送数据7.2 电脑通…

51单片机学习入门(三):串口

1.串口是什么&#xff1f; 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。 51单片机内部自带UART&#xff08;…

51单片机——串口通信(发送和接受数据)

目录 一、实现的功能 二、串口通信 2.1单片机发送数据 2.1.1串口初始化 2.1.2串口发送程序 2.1.3发送效果 ​2.2单片机接收数据 2.2.1串口初始化 2.2.2接收数据程序 2.2.3接收效果 一、实现的功能 通过串口&#xff08;UART&#xff09;让单片机与计算机进行通信。51单…

51单片机-串口通信

目录 1.什么是通信 1.1.通信的概念 1.2.传送方式 1.3.同步方式 1.4.传送方向 1.5.校验方式 2.单片机串口介绍 2.1.硬件电路 2.2.电平标准 2.3.常见接口 2.4.内部结构 2.5.相关寄存器 2.6.工作模式&#xff08;模式1&#xff09; 2.7.如何配置串口中断 3.实际应用…

IDEA调试注解处理器AbstractProcessor

1.右击项目Open In->Terminal 执行命令mvnDebug clean package 查看端口号 2.添加远程调试配置监听的端口 3.debug启动远程调试就欧克了

强大的IDEA调试工具

在开发中难免会遇到bug&#xff0c;而如何去跟有效率的去修复bug&#xff0c;除了必要的经验之外&#xff0c;巧妙的使用工具也是非常有必要的。 一下就是对IDEA强大调试工具的介绍 在调试代码的时候&#xff0c;你的项目得debug模式启动&#xff0c;也就是点那个绿色的甲虫启动…