STM32串口详解

article/2025/10/16 15:17:11

实验一:简单的利用串口接收中断回调函数实现数据的返回

 

关于串口调试助手,还应知道:

  • 发送英文字符需要用一个字符即8位,发送汉字需要两个字符即16位,如上图,发送汉字“姜”实际是发送“BD AA”而发送英文字符X实际是发送“58”,本质上没有太大区别;
  • 勾选了下方“发送新行”后,XCOM就会再你输入的需要发送的数据后自动加上一个回车(0X0D+0X0A),如果不勾选则我们在手动输入完“宋S”后还需敲一个回车键只有这样点击发送后,调试助手上方窗体才能将其显示,这是因为我们在程序的串口中断中自定义了一个数据接收协议,即只有当接受的数据以回车结尾(0X0D+0X0A),串口才认可数据接受完毕

这里可以看出下列代码中的 0D回车,0A换行 是用来判断结束位的

if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D))

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <string.h>//meset()函数调用
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
#define RXBUFFERSIZE  256     //最大接收字节数
char RxBuffer[RXBUFFERSIZE];   //接收数据
uint8_t aRxBuffer;			//接收中断缓冲
uint8_t Uart1_Rx_Cnt = 0;		//接收缓冲计数
/* USER CODE END PV */
  /* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);   //中断接收一个字符/* USER CODE END 2 */
/*
串口接收中断回调函数
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){if (Uart1_Rx_Cnt >= 255){memset(RxBuffer,0x00,sizeof(RxBuffer));//对数组进行清零操作HAL_UART_Transmit(&huart1,(uint8_t *)"数据溢出",4,0xffff);//}else{RxBuffer[Uart1_Rx_Cnt++]=aRxBuffer;   //接收数据转存if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位 0D回车,0A换行 {HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束Uart1_Rx_Cnt = 0;memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组}}HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);	//使得程序可以重新触发接收中断	+} 

上述代码实现的是 发送数据被返回

实验二:

1、串口发送/接收函数

  • HAL_UART_Transmit();串口发送数据,使用超时管理机制 
  • HAL_UART_Receive();串口接收数据,使用超时管理机制
  • HAL_UART_Transmit_IT();串口中断模式发送  
  • HAL_UART_Receive_IT();串口中断模式接收
  • HAL_UART_Transmit_DMA();串口DMA模式发送
  • HAL_UART_Transmit_DMA();串口DMA模式接收

2、串口中断函数

  • HAL_UART_IRQHandler(UART_HandleTypeDef *huart);  //串口中断处理函数
  • HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);  //串口发送中断回调函数
  • HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);  //串口发送一半中断回调函数(用的较少)
  • HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  //串口接收中断回调函数
  • HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
  • HAL_UART_ErrorCallback();串口接收错误函数

3串口查询函数

  HAL_UART_GetState();  判断UART的接收是否结束,或者发送数据是否忙碌

UART几个标志位

TXE、TC、RXNE、ORE。

TXE:发送数据寄存器为空 (Transmit data register empty)

  • 0:数据未传输到移位寄存器
  • 1:数据传输到移位寄存器

TC:发送完成 (Transmission complete)

  • 0:传送未完成
  • 1:传送已完成

RXNE:读取数据寄存器不为空 (Read data register not empty)

  • 0:未接收到数据
  • 1:已准备好读取接收到的数据

ORE:上溢错误 (Overrun error)

  • 0:无上溢错误
  • 1:检测到上溢错误

UART接收丢失数据

UART接收丢失数据与软件和硬件都有可能有关系,下面说几个常见丢失数据的原因及解决办法。

1.接收溢出丢失数据

指未及时取走数据导致溢出错误而丢失数据,通常是发生在大量数据、以查询方式接收数据的情况下。在MCU启动过程中、接收数据过多处理不及时、复杂系统响应不及时等情况都会出现数据丢失的情况。

解决办法:

  • 及时清除溢出错误标志
  • 利用通信协议过滤因数据丢失导致的问题

2.接收中断丢失数据

使用UART中断接收数据相比查询接收数据的方式更常见,中断方式比查询方式响应更及时,但不合理处理同样也会存在数据丢失的情况。

在数据量大时,UART接收中断函数耗时、优先级低等情况下容易丢失数据。

解决办法:

  • 中断函数里减少不必要的耗时
  • 合理分配中断优先级
  • 使能中断前清除标志位

3.时钟误差导致丢失数据

在通信波特率较高的情况下,如果时钟误差加大,很可能导致数据丢失。

解决办法:

  • 使用更高精度晶振
  • 降低通信波特率

UART发送丢失数据

UART发送丢失数据很多工程师都遇到过,通常情况下是传输未完成的原因。

HAL库已经有几年了,但还是有很多工程师都使用标准外设库,这时如果自己封装接口不当,就会存在发送最后一字节数据丢失的问题。

1.UART传输未完成导致数据丢失

如下代码,只考虑非空,但实际传输并未完成。

//往USART1,发送 length长度的数据data
void SendData(u8 *data,u8 length)
{u8 i;for(i=0;i<length;i++){USART_SendData(USART2, data[i]);while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)//等得发送完成{}  }
}

但发送非空不代表发送完成,虽然在某些场合更高效,但某些场合就会导致数据丢失。

比如:使用此函数发送之后进入休眠、关闭接收端设备电源等情况下。

解决办法:使用HAL封装的接口,代码包含判断传输完成

/******************************************************************************** @函数名称	SendData1* @函数说明   向串口1发送数组信息* @输入参数 data:要发送的信息的首地址len: 发送的长度* @输出参数   无* @返回参数   无
*******************************************************************************/
void SendData1(u8 *data,u8 length)
{u8 i;for(i=0;i<length;i++){HAL_UART_Transmit(&huart1,&data[i],length,0xFFFF); //将收到的信息发送出去,HAL封装的接口,代码包含判断传输完成}
}


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

相关文章

stm32串口实验

目录 &#xff08;一&#xff09;STM32 串口简介 (二)软件设计 &#xff08;三&#xff09;效果&#xff1a;​ 1.实现功能&#xff1a;STM32 通过串口和上位机的对话&#xff0c; STM32 在收到上位机发过来的字符串后&#xff0c;原原本本的返回给上位机。 &#xff08;一&…

STM32 串口乱码

问题描述 用正点原子STM32F4探索者开发板调试野火骄阳电机驱动程序&#xff0c;发现串口输出一直是乱码。问题排查&#xff1a; 串口调试助手编码方式&#xff1f;同一个串口调试助手&#xff0c;用正点原子、STM32CubeMX生成的程序发送数据正常。排除串口调试助手问题。串口…

STM32串口通信编程

重庆交通大学信息科学与工程学院 《嵌入式系统基础A》课程 实验报告&#xff08;2&#xff09; 班 级&#xff1a; 物联网工程2002 姓名-学号 &#xff1a; 徐权-632007060327 实验项目名称&#xff1a; STM32串口通信编程 实验项目性质&#xff1a; 设计性 实验所…

STM32串口驱动

首先了解串口通信的一些基本原理&#xff1a; ⚫ 串口通信&#xff1a; 串口通信是指数据通过一条数据线&#xff08;或者两条差分线&#xff09;一位接着一位的传输出去。串口通信的优点是占用硬件资源少&#xff0c;且传输距离较远&#xff0c;缺点是传输速度慢&#xff08;…

STM32串口

使用百问网的STM32F103MINI开发板完成下面实验。 1、通过STM32CubeMX配置串口。 串口1选择Asynchronous&#xff0c;异步通信。 115200bps&#xff0c;8N1&#xff0c;默认即可。 2、串口发送数据。 STM32Cube生成代码后&#xff0c;在main.c的while(1)前面加一句。 HAL_U…

STM32 串口详解

目录 01、USART的特点 02、USART简介 2.1、数据传输模型 2.2、帧结构 2.3、波特率 03、STM32的USART 04、代码配置 01、USART的特点 USART是通用异步收发传输器&#xff08;UniversalAsynchronousReceiver/Transmitter)&#xff0c;通常称作UART&#xff0c;是一种异步…

STM32入门教程——串口通讯

目录 1.认识串口 2.stm32串口介绍 2.1 查询方式 2.1 中断方式 2.2 DMA方式 3.使用stm32串口实现printf 串口作为嵌入式设备最常用的外设之一&#xff0c;被广泛的应用。本文介绍STM32串口的如何使用。从以下几个方面介绍&#xff1a; 1.认识串口 常用串口的引脚主要由TX…

STM32—串口

串口介绍 串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方式的扩展接口。串行接口&#xff08;Serial Interface&#xff09;是指数据一位一位地顺序传送。其特点是通信线路简单&#xff0c;只…

【stm32】串口通信

串口通信 一、串口通信协议原理二、usart功能框图三、stm32库的配置 一、串口通信协议原理 串口在嵌入式系统当中是一类重要的数据通信接口&#xff0c;其本质功能是作为 CPU 和串行设备间的编码转换器。当数据从 CPU 经过串行端口发送出去时&#xff0c;字节数据转换为串行的…

STM32-串口通信详解

目录 前言 一、通信接口背景知识 1. 并行通信和串行通信 2. 串行通信的分类 二、STM32的串口通信基础 1. 串口通信接口 2. 串口通信框图 3. 串口通信相关寄存器 4. 波特率计算方法 三、库函数配置 1. 串口配置一般步骤 总结 前言 众所周知&#xff0c;串口通信是MC…

STM32串口通信

STM32串口通信 一、串口 1.串口概述 串口是单片机中最常用也是最简单的一种通信方式通信&#xff1a;两个或两个以上的设备进行数据交换 串口是用于两个设备之间的异步全双工通信 异步——》两个设备不需要共时钟 全双工——》两个设备之间服务于数据交换的“线”有两根 Tx&…

STM32-串口通信(串口的接收和发送)

文章目录 STM32的串口通信一、STM32里的串口通信二、串口的发送和接收串口发送串口接收 三、串口在STM32中的配置四、串口接收的两种实现方式1. 需要更改的地方2. 查询RXNE标志位3. 使用中断 总结 STM32的串口通信 本文在于记录自己的学习过程中遇到的问题和总结&#xff0c;各…

STM32串口通信详解

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;玩转STM32 &#x1f4ac;保持学…

MacOS 安装 Matlab R2021b 手记

MacOS 安装 Matlab R2021b Maci64手记 1.下载MATLAB R2021b 安装包 2.双击MatlabR2021b_Mac64.dmg打开安装包,双击InstallForMacOSX.app开始安装程序 3.出现「install_unix想要进行更改」,出入开机密码,点击好 4.出现安装界面,点击「高级选项」,选择「我有文件安装密…

linux安装matlabRuntime

1.找到自己需要的文件夹&#xff0c;下载压缩包&#xff0c;版本自己发挥 wget https://ssd.mathworks.com/supportfiles/downloads/R2021a/Release/6/deployment_files/installer/complete/glnxa64/MATLAB_Runtime_R2021a_Update_6_glnxa64.zip 2.解压 unzip MATLAB_Runtim…

四步离线安装matlab工具包

四步离线安装matlab工具包 把刚才的压缩包解压在matlab 工具包的文件夹。&#xff08;其实哪里都行&#xff0c;防止误删&#xff09; 我的是matlab安装目录下面 打开Matlab --“主页” --“设置路径” 3. 添加文件夹-选择工具包文件夹 4. 点击切换路径按钮到工具包目录&am…

安装Matlab R2022a/64位

Matlab R2022a/64位下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1pb_523QrMvu–nOcmV1bqQ 提取码&#xff1a;lbcc 上面失效的看看这个 链接&#xff1a;https://pan.baidu.com/s/14cVeXQOLBqGfq3aKT45vPw 提取码&#xff1a;piq7 怎么快速下可以私信我。…

如何安装matlab?官网下载详细教程

MATLAB下载和安装教程&#xff08;官网下载&#xff09; 很多人在遇到专业数据处理时都得用到专业的数学软件&#xff0c;matlab就是这样一款对于数据处理非常有帮助的支持数据分析、算法开发和建模的专业工科数学软件。那么&#xff0c;怎么可以快速的正确安装&#xff1f;下…

【首发】 ubuntu20.04安装matlab2021b/matlab2020b

文章目录 一、下载地址1.1 2021b下载链接(BT)1.2 2021a下载链接1.3 2020b CSDN下载链接 二、MATLAB2021b安装方法2.1 Mount .iso文件2.2 通过./install 启动安装程序2.3 输入正版Key安装2.4 直接下一步2.5 选安装文件夹&#xff08;权限够&#xff09;2.6 选需要的包2.7 选link…

服务器远程安装Matlab2015

因为在windows上跑matlab实验&#xff0c;出现内存不足的情况&#xff0c;因此&#xff0c;希望能在服务器上安装一个matlab。然后出现各种问题&#xff0c;花了一天时间才装好&#xff0c;特此记录下。因为对于没装过的童靴来说&#xff0c;每一个步骤都很关键&#xff0c;因此…