【stm32】串口通信

article/2025/10/15 18:29:24

串口通信

  • 一、串口通信协议原理
  • 二、usart功能框图
  • 三、stm32库的配置

一、串口通信协议原理

串口在嵌入式系统当中是一类重要的数据通信接口,其本质功能是作为 CPU 和串行设备间的编码转换器。当数据从 CPU 经过串行端口发送出去时,字节数据转换为串行的位;在接收数据时,串行的位被转换为字节数据。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。典型地,串口用于 ASCII 码字符的传输。通信使用3根线完成:地线,发送数据线,接收数据线。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配:波特率是一个衡量通信速度的参数,它表示每秒钟传送的 bit 的个数;数据位是衡量通信中实际数据位的参数,当计算机发送一个信息包,标准的值是 5,7 和 8 位。如何设置取决于你的需求;停止位用于表示单个包的最后一位,典型的值为 1,1.5和 2 位,停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会;奇偶校验位是串口通信中一种简单的检错方式,有四种检错方式——偶、奇、高和低,也可以没有校验位。
对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。

物理层:物理层上我们这里拿出标准的RS232串口和USB转串口进行分析、讲解。在物理层上我们用到最多的还是USB转串口。
RS232:
在这里插入图片描述
在原理图上我们可以看到右侧RS232串口上两个通讯设备的“DB9 接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232 标准”传输数据信号。由于 RS-232 电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片(MAX3232CSE)”转换成控制器能识别的“TTL 校准”的电平信号才能实现通讯。

我们知道常见的电子电路中常使用 TTL 的电平标准,理想状态下,使用 5V 表示二进制逻辑 1,使用 0V 表示逻辑 0;而为了增加串口通讯的远距离传输及抗干扰能力,它使用-15V 表示逻辑 1,+15V 表示逻辑 0。由于控制器一般使用 TTL 电平标准,所以常常会使用 MA3232 芯片对 TTL 及 RS-232 电平的信号进行互相转换。即:
在这里插入图片描述

USB转串口:
这个通讯方式是在单片机中最经常运用到的通讯方式。USB转串口主要用于设备跟电脑通信。
在这里插入图片描述
这里原理图上用到的电平转换芯片主要是CH340G。一般我们主要运用的电平转换芯片有:CH340、PL2303、CP2102、FT232。

协议层:我们在使用串口的时候主要还是用到“通用异步通讯”——可以参考通讯基本概念基础。这篇讲解了通讯的一些基本原理。所以在协议层上就不多讲解这个概念问题了。

协议层是指串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口。在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据。如图所示:
在这里插入图片描述

二、usart功能框图

在这里插入图片描述
在功能框图上把其划分为四个部分——GPIO引脚、数据寄存器、控制器、波特率。我们在这里就主要讲解前三大功能,波特率一般可以在stm32上自主设置波特率的值(一般常用9600、15200)。

GPIO引脚:在功能框图上对应的1框图上我们看到主要有Tx、Rx、SW_RX、nRTS、nCTS、SCLK六个功能引脚,在stm32上这些功能引脚当中最常用的是Tx、Rx引脚。

TX:发送数据输出引脚。
RX:接收数据输入引脚。
SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚(很少用到)。
nRTS:请求以发送 (Request To Send),n 表示低电平有效。如果使能 RTS 流控制,当 USART 接收器准备好接收新数据时就会将nRTS引脚变成低电平;当接收寄存器已满时,nRTS 将被设置为高电平。该引脚只适用于硬件流控制。
nCTS:清除以发送 (Clear To Send),n 表示低电平有效。如果使能 CTS 流控制,发送器在发送下一帧数据之前会检测nCTS引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。
SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。

注意:在stm32的UART 只是异步传输功能,所以没有SCLK、nCTS 和nRTS 功能引脚。

数据寄存器:数据寄存器控制usart的读取还是发送。在官方的参考手册上对于数据寄存器(USART_DR)是这样描述的——包含接收到数据字符或已发送的数据字符,具体取决于所执行的操作是“读取”操作还是“写入”操作。
因为数据寄存器包含两个寄存器,一个用于发送 (TDR),一个用于接收 (RDR),因此它具有 双重功能(读和写)。

对于写的时候我们数据寄存器选择TDR寄存器,在进行偏移0x04个位,在传输到发送数据传输引脚(Tx)。
在这里插入图片描述
在读取的时候原理同读取一样。
在这里插入图片描述
控制器:主要是由控制寄存器USART_CR1、USART_CR2、USART_CR3共同进行控制;在功能框图上我们可以发现其USART的控制器具有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。

发送器:当 USART_CR1 寄存器的发送使能位 TE 置 1 时,启动数据发送,发送移位寄存器的数据会在 TX引脚输出,如果是同步模式 SCLK 也输出时钟信号。一个字符帧发送需要三个部分:**起始位 + 数据帧 + 停止位。**起始位是一个位周期的低电平,位周期就是每一位占用的时间;数据帧就是我们要发送的 8 位或 9 位数据,数据是从最低位开始传输的;停止位是一定时间周期的高电平。停止位时间长短是可以通过 USART 控制寄存器2(USART_CR2) 的 STOP[1:0] 位控制,可选 0.5个、1 个、1.5 个和 2 个停止位。默认使用 1 个停止位。2 个停止位适用于正常 USART 模式、单
线模式和调制解调器模式。0.5 个和 1.5 个停止位用于智能卡模式。

在这里插入图片描述
当发送使能位 TE 置 1 之后,发送器开始会先发送一个空闲帧 (一个数据帧长度的高电平),接下来就可以往 USART_DR 寄存器写入要发送的数据。在写入最后一个数据后,需要等待 USART 状态寄存器 (USART_SR) 的 TC 位为 1,表示数据传输完成,如果 USART_CR1 寄存器的 TCIE 位置1,将产生中断。
在这里插入图片描述
接收器:如果将 USART_CR1 寄存器的 RE 位置 1,使能 USART 接收,使得接收器在 RX 线开始搜索起始位。在确定到起始位后就根据 RX 线电平状态把数据存放在接收移位寄存器内。接收完成后就把接收移位寄存器数据移到 RDR 内,并把 USART_SR 寄存器的 RXNE 位置 1,同时如果USART_CR2 寄存器的 RXNEIE 置 1 的话可以产生中断。
在这里插入图片描述

三、stm32库的配置

主要的函数:

USART_Init();  //初始化串口
USART_ITConfig(); //中断配置函数
NVIC_Init();  //配置中断
USART_SendData();  //数据发送函数
USART_GetFlagStatus(); //接受标志位函数
USART_GetITStatus();  //发送标志位函数
USART_ClearITPendingBit();//清除中断预处理
USART_ReceiveData();  //数据接受函数 

usart_init()

void USART2_Init(unsigned long ulBaud)
{GPIO_InitTypeDef GPIO_InitStruct;USART_InitTypeDef USART_InitStruct;NVIC_InitTypeDef NVIC_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStruct); USART_InitStruct.USART_BaudRate = ulBaud;  //波特率USART_InitStruct.USART_WordLength = USART_WordLength_8b; //8位数据位USART_InitStruct.USART_StopBits = USART_StopBits_1;  //1位停止位USART_InitStruct.USART_Parity = USART_Parity_No;  //无校验位USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式USART_InitStruct.USART_HardwareFlowControl= USART_HardwareFlowControl_None;//硬件流控制,一般选择noneUSART_Init(USART2, &USART_InitStruct);// 使能串口USART_Cmd(USART2, ENABLE);// 允许串口接受中断USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);	// 允许串口中断NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;//中断通道为串口2NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//先站优先级NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;//从占优先级NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能NVIC_Init(&NVIC_InitStruct);
}

发送一个字符

unsigned char USART_SendChar(USART_TypeDef* USARTx, unsigned char ucChar)
{while(!USART_GetFlagStatus(USARTx, USART_FLAG_TXE));//不断检查标志位USART_SendData(USARTx, ucChar);//发送字符数据return ucChar;//返回发送的字符
}

发送字符串

void USART_SendString(USART_TypeDef* USARTx, unsigned char* pucStr)
{while(*pucStr != '\0')USART_SendChar(USARTx, *pucStr++);
}

接受中断

void USART2_IRQHandler(void)
{	u8 temp;if(USART_GetITStatus(USART2,USART_IT_RXNE) == SET){USART_ClearITPendingBit(USART2,USART_IT_RXNE);temp =  USART_ReceiveData(USART2);if(temp == '\n'){RXCUNT = 0;RXOVER = 1;USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);}else{RXBUF[RXCUNT] = temp;RXCUNT++;}}
}

main函数
在main函数上要用到几个标志位

u8 RXBUF[20];  //储存数组
u8 RXCUNT=0;   //接受计数
u8 RXOVER=0;     //接受标准
int main(void)
{USART2_Init(9600);while(1){if(RXOVER==1)   //接受标志位{RXOVER=0;   //标志清零USART_ITConfig(USART2,USART_IT_RXNE, ENABLE);   //清除中断标志位if(RXBUF[0]=='C')   //当发送“C”则打印1111{USART_SendString(USART2,"  1111  ");	}if(RXBUF[0]=='S'){USART_SendString(USART2,"  2222  ");	}memset(RXBUF,'\0',sizeof(RXBUF));  //清空数组}}
}

注意:在我们使用串口清空函数(memser)的时候头文件要加上#include"string.h"。不然会报错。
现象:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/5eyqtIF3.shtml

相关文章

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权限。 安装包下载链…

Linux安装Matlab

系统环境:Ubuntu 20.04Matlab版本:R2019b 首先下载Matlab的ios文件(这个版本有18G,再传到服务器上,真是漫长的修行。。) 在服务器上把ios文件单独放到一个目录里,比如叫Matlab/,然后…