单片机(STM32-串口通信)

一、串口通信基础概念

串口通信(Serial Communication)是一种在计算机和外部设备之间进行数据传输的通信方式。它通过串行方式逐位传输数据,是最基本和常用的通信接口之一。

主要特点

1. 串行传输

(1)数据按位顺序传输,一次只能传输一位

(2)相比并行通信,串口通信使用更少的线路

(3)传输距离可以更远,抗干扰能力更强

2. 异步通信

(1)发送方和接收方使用独立的时钟

(2)通过起始位和停止位来同步数据

(3)不需要共享时钟信号

二、通信基础

1.时钟信号划分

1.1通信方式

异步通信

无需时钟信号,数据通过起始位和停止位同步。

同步通信

需要时钟信号同步数据传输。

1.2传输方式

同步传输

(1)发送方和接收方使用相同的时钟

(2)数据传输效率高需要时钟同步机制

异步传输

(1)发送方和接收方使用独立的时钟

(2)通过起始位和停止位同步

(3)实现简单,但效率较低

(4)但是并不是说通信的过程不同步(UART)

2.数据传输方式

2.1通信方式

串行通信

使用串行传输的方式传输数据

并行通信

使用并行传输的方式传输数据

2.2传输方式

串行传输

(1)数据按位顺序传输

(2)只需要一条传输线

(3)传输距离远,成本低

(4)速度相对较慢

并行传输

(1)多位数据同时传输

(2)需要多条传输线

(3)传输距离短,成本高

(4)速度相对较快

3.通信方向划分

单工 :要么收,要么发,只能做接收设备或者发送设备。比如收音机

一根信号线只能单向发送或单向接收

半双工 :可以收,可以发,但是不能同时收发, 比如对讲机

一根信号线可以接收数据也可以发送数据,但是两者不能同时进行

全双工 :可以在同一时刻既接收,又发送。 手机

两根信号线,一根发送数据,另一根接收数据,真正实现同时收发数据,速度快

4.常见通信总结

通信标准 引脚说明 通信方式 通信方向
UART(通用异步收发器) TXD: 发送端<br>RXD: 接受端<br>GND: 公共地 异步通信 全双工
单总线(1-wire) DQ: 发送/接受端 异步通信 半双工
SPI SCK: 同步时钟<br>MISO: 主机输入,从机输出<br>MOSI: 主机输出,从机输入<br>SS: 片选 同步通信 全双工
I2C SCL: 同步时钟<br>SDA: 数据输入/输出端 同步通信 半双工

三、UART

1.通用同步/异步收发器

USART:通用同步/异步收发器是一种集成在微控制器或通信芯片中的硬件模块,它几支持同步通信,也支持异步 通信,但是在STM32中一般是同步

2.串口通信协议

2.1.概念

串口通信协议是一种数据逐位(bit)依次传输的通信方式,常用于点对点的短距离数据交换。

最常见的串口通信协议是RS-232、RS-485等。

2.2.基本特性

**异步通信:**无需专用时钟线,数据帧通过起始位和停止位同步。

**全双工:**可以同时进行收发(如UART)。

**点对点:**一般只连接两个设备。

2.3.基本属性

**波特率:**衡通信速度,表示美妙传送点bit的个数

**数据位:**表示通信中实际数据位的个数,一般是5、7、8位

起始、停止位:数据包从起始位开始,到停止位结束。停止位置在的典型的值为1,1.5和2位。

**2.4.奇偶校验位:**在串口通信中一种简单的检错方式(在每个数据字节后面增加1位校验位,用于检测数据在传输过程中是否发生了单比特错误。)

3.USART结构图

3.1.发送流程:

(1)CPU将数据写入USART_TDR
(2)硬件自动将TDR数据复制到移位寄存器
(3)移位寄存器逐位将数据发送到TX引脚

3.2.接收流程:

(1)数据到达RX引脚
(2)移位寄存器逐位收集数据
(3)数据完整后硬件自动转义至RDR

4.相关寄存器

4.1. 数据接收寄存器(Receive Data Register)

**(1)作用:**用于存放USART接收到的数据。

**(2)工作原理:**当USART模块收到一个字节的数据后,会自动将其存入数据接收寄存器。CPU可以从该寄存器读取数据。

(3)数据接收寄存器32位代表的含义:

4.2. 数据发送寄存器(Transmit Data Register)

**(1)作用:**用于存放即将通过USART发送的数据。

**(2)工作原理:**CPU将要发送的数据写入该寄存器,USART模块会自动将其发送出去。如图:

(3)数据发送寄存器32位代表的含义:

4.3. 中断和状态寄存器(Interrupt and Status Register)

**(1)作用:**用于指示USART的各种状态(如发送完成、接收完成、溢出、错误等),并控制中断的使能与响应。

(2)中断和状态寄存器32位代表的含义:

(3)常见标志位:

TXE(Transmit Data Register Empty):发送寄存器空,可以写新数据

RXNE(Read Data Register Not Empty):接收寄存器非空,有新数据可读

TC(Transmission Complete):发送完成

ORE(Overrun Error):溢出错误

(4)例如第七位是寄存是发送寄存器是否为空的状态:

4.4. 波特率寄存器(Baud Rate Register)

**(1)作用:**用于设置USART通信的波特率(即每秒传输的比特数)。
(2)波特率寄存器32位代表的含义:

4.5.总结

寄存器名称 作用 常见寄存器名 典型操作
数据接收寄存器 存放接收到的数据 RDR 读取数据
数据发送寄存器 存放待发送的数据 TDR 写入数据
中断和状态寄存器 状态指示和中断控制 ISR 判断状态/响应中断
波特率寄存器 设置通信速率 BRR 设置波特率

五、实现串口通信

关键在于:通过寄存器实现输出数据,每一个代码

还有代码必须写在特定位置才行

1.一秒发送一字节数据

2.封装进函数可以直接调用输出

3.修改自写函数实现通信功能

打开连接串口,烧录程序后,复位后,串口就可以接收到数据。

六、ptintf重定向

复制代码
int  printf(const char * format,...)

printf函数底层调用的是fputc函数,fputs是将要发送的数据写入到标准输出流stdout

复制代码
int fputc(int /*c*/, FILE * /*stream*/) 

因此如果想让printf将数据输出到串口,需要重写fputc

1.添加串口通信


2.设置代码输出名字和格式

3.勾选选项

4.为你的STM32工程启用 MicroLIB 微型C库

5.导入库函数

6.重写函数

七、scanf重定向

1.添加头文件

2.重写fgetc函数

八、H A L 函数

1.串口 发送 函数

复制代码
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
功能:以阻塞模式通过串口发送数据
参数:UART_HandleTypeDef * huart 设备的句柄(用的是哪个串口)
        uint8_t * pData  要输出的缓存区首地址 (要发的数据)
         uint16_t Size  发送的数据量	(发送多少个字节的数据)
         uint32_t Timeout  超时时间	(给他发送的最长时间)
返回值:发送状态

2.串口 接收 函数

和重定向的scanf最大区别在于:这个函数不会阻塞进程,缺点就是有时候可能会取不到值。

复制代码
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

          功能:以阻塞模式通过串口接收数据
         参数:UART_HandleTypeDef * huart 设备的句柄
                      uint8_t * pData 输入缓存区首地址 
                      uint16_t Size  接收的数据量
                      uint32_t Timeout  超时时间(会等待这些时间来接收数据)
         返回值:接收状态
相关推荐
wind_one12 小时前
STM32小实验1--点亮LED
stm32·单片机·嵌入式硬件
szxinmai主板定制专家4 小时前
基于光栅传感器+FPGA+ARM的测量控制解决方案
arm开发·人工智能·嵌入式硬件·fpga开发
Ronin-Lotus5 小时前
嵌入式硬件篇---单稳态&多谐&施密特电路
单片机·嵌入式硬件
逼子格6 小时前
权电阻网络DAC实现电压输出型数模转换Multisim电路仿真——硬件工程师笔记
笔记·嵌入式硬件·硬件工程·硬件工程师·adc·硬件工程师真题·权电阻网络dac
Ronin-Lotus9 小时前
嵌入式硬件篇---晶体管的分类
嵌入式硬件·晶体管·bjt(双级结性晶体管)·fet(场效应晶体管)
熬夜的猪仔12 小时前
第二章 基于新版Onenet搭建云服务(stm32物联网)
stm32·物联网·freertos
会编程的小孩1 天前
STM32用PWM驱动步进电机
stm32·单片机·嵌入式硬件
努力做小白1 天前
Linux驱动11 --- buildroot&杂项驱动开发方法
linux·运维·驱动开发·单片机·嵌入式硬件
小眼睛FPGA1 天前
【RK3568+PG2L50H开发板实验例程】FPGA部分 | 以太网传输实验例程
科技·单片机·嵌入式硬件·ai·fpga开发·fpga