STM32—串口

article/2025/10/16 15:36:08

串口介绍

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢是设备间接线通信的一种方式数据一位一位地顺序传送双向通信,全双工传送速度相对较慢
UART是异步串行接口,通信双方使用时钟不同,因为双方硬件配置不同,但是需要约定通信 速度,叫做波特率。对于单片机和pc之间通信,pc端用软件配置,则单片机需要用代码完成配置,也可以用波特率配置软件直接生成
在这里插入图片描述

常用函数的介绍

串口发送/接收函数:

 - HAL_UART_Transmit();//串口发送数据,使用超时管理机制- HAL_UART_Receiver();//串口接收数据,使用超时管理机制- - HAL_UART_Transmit_IT();//串口中断模式发送- HAL_UART_Receive_IT();//串口中断模式接收作用:以中断的方式接收指定字节的数据
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
参数1:UART_HandleTypeDef 结构体类型指针变量
参数2:指向要发送的数据地址
参数3:要发送的数据大小,以字节为单位
参数4:设置的超时时间,ms为单位
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
参数1:UART_HandleTypeDef 结构体类型指针变量
参数2:指向接收数据缓存区
参数3:要接收的数据大小,以字节为单位
参数4:设置的超时时间,ms为单位

串口中断回调函数

void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)//串口中断处理函数
__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)//发送中断回调函数
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//接受中断回调函数

状态标志变量
USART_RX_STA
从0开始,串口中断接收到一个数据(一个字节)就自增1。当数据读取全部OK的时候(回车和换行符来的时候),那么USART_RX_STA的最高位置置1,表示串口数据接收全部完毕了。然后main函数里面可以处理数据了。
在这里插入图片描述

串口接收中断流程
在这里插入图片描述

串口实验(非中断)

需求:接收串口工具发送的字符串,并且将其发送回串口工具
TX——PA10 RX——PA9(交叉接线)
使用CubeMX配置工程,串口配置
1.选定串口
2.选择模式
异步通信
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
效果:在这里插入图片描述

如何使用printf打印数据到串口调试助手
1.重写fputc函数

int fputc(int ch,FILE *f)
{unsigned char temp[1] = {ch};HAL_UART_Transmit(&huart1,temp,1,0xffff);return ch;

2.添加#include stdio.h头文件,使用MicroLIB库
在这里插入图片描述

  while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *///HAL_UART_Transmit(&huart1,"hello\n",strlen("hello\n"),100);HAL_UART_Receive(&huart1,buff,19,100);//	HAL_UART_Transmit(&huart1,buff,strlen(buff),100);//	printf("hello wrold\n");printf(buff);//打印到串口调试助手memset(buff,0,20);//清空buff}/* USER CODE END 3 */

串口实验(中断)

需求:通过中断的方法接收串口工具发送的字符串,并将其发送回串口工具
串口配置
1.选定串口
2.选择模式
异步通信
前面步骤与上面一样
打开串口中断
在这里插入图片描述
根据中断接收流程可知,最后会在UART_Receive_IT函数中调用HAL_UART_RxCpltCallback函数,该函数为一个虚函数,我们可以在main.c中重写,接收到一个数据,就在函数中处理
在这里插入图片描述

在这里插入图片描述

//定义最大接收字节数200
#define USART_REC_LEN 200//接收缓冲,串口接收到的数据放到这个数组里面,最大USART_REC_LEN字节
uint8_t UART1_RX_Buffer[USART_REC_LEN];
uint8_t buf = 0;
uint16_t USART_RX_STA = 0;//接收完成回调函数,收到一个数据后,在这里处理
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{//1.判断中断是由哪个串口触发if(huart->Instance == USART1){//判断接收是否完成(USART_RX_STA的bit15位置为1)if((USART_RX_STA & 0x8000) == 0){//等于0则表示没有接收完成//如果收到了0x0d(回车),看bit14是否为1if(USART_RX_STA & 0x4000){//则继续判断是否收到0x0a(换行)if(buf == 0x0a){//如果0x0a和0x0d都收到,则将bit15位置置1USART_RX_STA |= 0x8000;}else {//否则认为接收错误,USART_RX_STA置0USART_RX_STA = 0;}}else {  //如果没有收到0x0d回车//先判断这个字符是否是0x0d回车if(buf == 0x0d){//是的话就将bit14置1USART_RX_STA |= 0x4000;}else {//不是的话,就将接收到的数据保存到缓存数组里面去UART1_RX_Buffer[USART_RX_STA & 0x3FFF] = buf;USART_RX_STA++;//如果接收数据大于USART_REC_LEN(200字节),则重新开始接收if(USART_RX_STA > USART_REC_LEN - 1 ){USART_RX_STA = 0;}}}}//重新开启中断HAL_UART_Receive_IT(&huart1,&buf,1);}}

参考博文:http://t.csdn.cn/q4IPk
解释:从串口接收到的数据只有一个字节的,也就是串口是一个字节一个字节进行判断的,每次buf里面都是最新的字节,所以我们要读到一条完整的或者指定的数据长度,我们就要用UART1_RX_Buffer来存储,而USART_RX_STA就是辅助判断数据状态的。
在这里插入图片描述
两个表对应看,想要知道触发串口中断后,串口是否接收完成所有数据(0代表没有接收完成,1代表完成。)

UART1_RX_Buffer是专门存放数据的,串口接收到一个字节的数据,USART_RX_STA就会累加,UART1_RX_Buffer[USART_RX_STA]=buf就可以按顺序保存数据,但是bit15和bit14位指定进行两个判断功能,就不能拿来使用保存数据,所以我们这里&0X3FFF来截断数据。

//不是的话,就将接收到的数据保存到缓存数组里面去
UART1_RX_Buffer[USART_RX_STA & 0x3FFF] = buf;
USART_RX_STA++;				
//如果接收数据大于USART_REC_LEN(200字节),则重新开始接收
if(USART_RX_STA > USART_REC_LEN - 1 ){USART_RX_STA = 0;						}

main函数

int main(void)
{/* USER CODE BEGIN 1 */// unsigned char buff[20] = {0};/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1,&buf,1);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){	//判断串口是否接收完成if(USART_RX_STA & 0x8000){printf("收到数据:");//将收到的数据发送到串口HAL_UART_Transmit(&huart1,UART1_RX_Buffer,USART_RX_STA & 0x3FFF,0xffff);//等待发送完成while(huart1.gState != HAL_UART_STATE_READY);printf("\r\n");//重新开始下一次接收USART_RX_STA = 0;}printf("hello world\n");HAL_Delay(1000);}/* USER CODE END 3 */
}

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

相关文章

【stm32】串口通信

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

STM32-串口通信详解

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

STM32串口通信

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

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

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

STM32串口通信详解

✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!! 📃个人主页:rivencode的个人主页 🔥系列专栏:玩转STM32 💬保持学…

MacOS 安装 Matlab R2021b 手记

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

linux安装matlabRuntime

1.找到自己需要的文件夹,下载压缩包,版本自己发挥 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 工具包的文件夹。(其实哪里都行,防止误删) 我的是matlab安装目录下面 打开Matlab --“主页” --“设置路径” 3. 添加文件夹-选择工具包文件夹 4. 点击切换路径按钮到工具包目录&am…

安装Matlab R2022a/64位

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

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

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

【首发】 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 选安装文件夹(权限够)2.6 选需要的包2.7 选link…

服务器远程安装Matlab2015

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

从零开始在linux服务器设置matlab-1.安装matlab

目录 0.安装matlab (1)安装x11客户端 1.下载ssh工具 MobaXterm 2.创建ssh连接 3.配置服务器x11转发 (1)安装matlab 1.上传安装包 2.挂载iso 3.安装 4.弹出gui,按照gui的指引操作 到此安装完成 0.安装matlab 安装matlab时因为需要gui 而linux服务器默认没有所以…

Ubuntu18.04安装Matlab2019b

1.下载Matalab2019b 链接: https://pan.baidu.com/s/1yEOnDnm0XqqyY2-jkPOQZQ 提取码: qwer 2.创建挂载文件目录 // 在任意目录下创建挂载文件目录(我是在temp目录) sudo mkdir matlab3.挂载镜像 sudo mount -o loop [镜像文件的路径] [指定的…

Ubuntu安装matlab2018a

一. 安装文件 链接: https://pan.baidu.com/s/1H2JWXVZjoNOkLhhpVj8gzg 提取码: rb21 文件目录: 二. 安装步骤 1. 解压Matlab2018aLinux64Crack.tar.gz文件: $ tar -xzvf Matlab2018aLinux64Crack.tar.gz 解压后的文件目录: 2. 建立挂…

如何安装matlab2016b

如何安装matlab2016b,详细步骤教程 首先下载软件R2016b_win64.iso,然后解压,或者挂载到光驱中,点击setup.exe运行。如果出现错误,cannot find appropriate setup file表示解压或者挂载出错了。重新解压或者挂载一下。 license选择…

Ubuntu20.04安装matlab详细教程

这里安装的是MATLAB2015b版本,其他版本也可参照这个安装步骤! 1. matlab2015b版本安装文件下载链接 链接: https://pan.baidu.com/s/1Xr1TFSrqDZAbhvyEff28rQ 密码: ojj0 2. MATLAB2015安装过程详解 下载的文件夹应该包含如下东西 第一步&#xff0c…

ubuntu18.04安装matlab2018

1. 一. 安装前的准备工作 将下载好的文件R2018a_glnxa64_dvd1.iso, R2018a_glnxa64_dvd2.iso, Crack放到目录/home/zzw/Downloads下 在该目录下新建dvd文件夹:mkdir dvd 二. 挂载镜像文件并安装Matlab 原文链接:https://blog.csdn.net/qq_37643960/a…

Ubuntu18.04 安装Matlab2021b

Ubuntu18.04/Linux下 安装Matlab2021b 1、软件下载2、安装3、安装matlab-support4、安装Troubleshotting5、安装成功开始使用6、更改系统默认快捷键7、可能出现的错误 1、软件下载 链接: https://pan.baidu.com/s/1e2w_ZXIoibMG6PfqVbf-6Q 提取码: dmfu解压后共有俩文件 2、…

Linux下安装Matlab

Linux下安装Matlab 安装包安装流程1.解压缩2.安装3.安装界面4.激活 使用1.环境变量配置2.计算分区选择3.运行4.并行 卸载 安装包 安装包上传服务器或者外置光驱安装。 我是把安装包上传到服务器,解压后安装到个人目录下,不需要root权限。 安装包下载链…