STM32 串口通讯及实现

article/2025/10/16 15:21:48

目录

    • 一、串口通讯概述
      • 1、广义的串口
      • 2、狭义的串口
      • 3、串口数据定义
      • 4、串口通讯应用
    • 二、STM32串口工程标准库实现
      • 1、串口的初始化
      • 2、串口数据发送.
      • 3、串口的数据接收


一、串口通讯概述

1、广义的串口

  广义的串口是针对并口来说的。串口是指设备之间通过一根数据信号线按数据位形式一位一位地传输数据的通讯端口,同一时刻只能传输一位(bit)数据。并口则是指用多条数据线进行传输的通讯方式,可以同一时刻并排传输多个数据位的数据端口。

2、狭义的串口

  狭义的串口我们就特指COM口,或者称做UART口。硬件上常用的两大电压标准有TTL(只有正电压)和RS232标准(有正负电压),STM32单片机上基本都使用的TTL标准,判别电压为基准供电电压的一半。我们看到的单片机上的串口一般分为两种,一种叫USART,通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter),另一种为UART,通用异步收发器(Universal Asynchronous Receiver and Transmitter),唯一的区别很明显,就是有和没有同步通讯方式。通常硬件至少要有一对Tx和Rx加上一个GND地,有了这三个引脚就可以工作了,其它同步引脚等其它引脚可以不使用。

3、串口数据定义

  完整的侦结构见下图,从一个起始位开始,接着是着多位有效数据,一般常规定义为8位,后面的就效验位,为可以选,最后一个就是停止标志位,也就是说8位有效数据的时候一个完整的帧结构就需要10位。
  波特率是描述串口通讯的速度指标,有很多种,双方约定好就可以正常通讯,我们常用的有9600、115200、921600,定位bps,位每秒。
在这里插入图片描述

4、串口通讯应用

  串口是我们使用的最基础的通信方式之一,因为引脚少,连接方便,它经常用来打印log,或作为短距离较少数据的通信方式,也可以替代I2C等偏低速通信方式。


二、STM32串口工程标准库实现

1、串口的初始化

  在STM32工程main的最开始,大while()循环之前,我们的各种外设都需要初始化,如下面串口的初始化代码, 它是用来驱动串口的初始化函数uart1_init(),输入参数为波特率baud_rate,从注释中可以看到,初始化要进行以下操作步骤:
1、使能时钟;
2、自动复用的引脚,
3、配置引脚的初始化状态方式;
4、配置串口的通信属性;
5、使能串口;
6、初始化嵌套向量中断控制器中的相关中断参数,为接收做准备。

//初始化IO 串口1 
//bound:波特率
void uart1_init(u32 baud_rate)
{//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;//#if EN_USART1_RX	NVIC_InitTypeDef NVIC_InitStructure;//#endifRCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟//串口1对应引脚复用映射GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1//USART1端口配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//速度50MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化//USART1 初始化串口属性设置USART_InitStructure.USART_BaudRate = baud_rate;//波特率设置USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_Cmd(USART1, ENABLE);  //使能串口1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断//Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;		//子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器}

2、串口数据发送.

  (1) 代码实现发送给串口1较为简单,一句话搞定:

Usart_SendString( USART1, send_data);

  • 参数USART1为串口的名称,它对应着外设的内存地址映射。
  • 参数send_data则是我们要发送的字符串数据,或者说是字符串指针。

   (2) 重定向printf()到USART1:

  • 重定向打印输出到串口1,需要定义fputc(),将打印数据的状态寄存器和数据寄存器映射到串口1,这样串口1就是打印数据口了。

int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}


/*****************  发送一个字节 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{/* 发送一个字节数据到USART */USART_SendData(pUSARTx,ch);/* 等待发送数据寄存器为空 */while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}/*****************  发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{unsigned int k=0;do {Usart_SendByte( pUSARTx, *(str + k) );k++;} while(*(str + k)!='\0');/* 等待发送完成 */while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET){}
}//重定向printf到USART1
int fputc(int ch, FILE *f)
{ 	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   USART1->DR = (u8) ch;      return ch;
}

3、串口的数据接收

   因为单片机串口接收是一个字节一个的接收的,接收到一个字节就会进入到中断服务函数中。我们可以在中断中进行字节判断,如下面的代码实例,也可以接收一段字符后做字符串匹配判断。这里需要注意几点:

  • 中断服务程序的命名是有严格要求的,请注意不要写错,否者写错了也不给报错,很难找到问题原因。
  • 中断服务程序中运行的时间越短越好,也就是说代码,尽量少做判断越精简越好。
u16 num1 = 0;//数据累加计数
char USART_RX1_BUF[HOST_REC_LEN];//接收缓冲字节.// 串口中断服务函数
void USART1_IRQHandler(void)
{		if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//enum{RESET = 0, SET = !RESET} FlagStatus{	USART_RX1_BUF[num1] = (uint8_t)USART_ReceiveData(USART1);// 当接收到的值等于\r\n结尾时截取数据if(num1 > 2 && USART_RX1_BUF[num1-1] == '\r' && USART_RX1_BUF[num1] == '\n'){USART_RX1_BUF[num1+1]='\0';SetUARTFlag(1);//设置UART1标志num1 = 0;return;}//超出长度溢出时截断数据else if(num1 >= LimitSize_1){USART_RX1_BUF[num1]=0x0d;//回车USART_RX1_BUF[num1+1]=0x0a;//换行USART_RX1_BUF[num1+2]='\0';SetUARTFlag(1);//设置UART1标志num1 = 0;}//正常累加,判断异常数据else{if(USART_RX1_BUF[0]!=0)num1 ++;else num1 = 0;}  }	 }

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

相关文章

STM32串口配置

目录 串口设置的一般步骤: 1) 串口时钟使能,GPIO 时钟使能 2) 串口复位 3) GPIO 端口模式设置 4) 数据发送与接收 5) 串口状态 6) 使能串口 7) 开启串口响应中断 8.获取相应中断状态 串口设置的一般步骤: 1) 串口时钟使能&#xff0…

STM32串口详解

实验一:简单的利用串口接收中断回调函数实现数据的返回 关于串口调试助手,还应知道: 发送英文字符需要用一个字符即8位,发送汉字需要两个字符即16位,如上图,发送汉字“姜”实际是发送“BD AA”而发送英文字…

stm32串口实验

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

STM32 串口乱码

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

STM32串口通信编程

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

STM32串口驱动

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

STM32串口

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

STM32 串口详解

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

STM32入门教程——串口通讯

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

STM32—串口

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

【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就是这样一款对于数据处理非常有帮助的支持数据分析、算法开发和建模的专业工科数学软件。那么,怎么可以快速的正确安装?下…