串口是什么
- 串行通信接口
串行通信:数据一位一位地传
并行通信:数据通过多条线同时传输
USART 通用同步异步收发器
- 两根线:TX=发送 (Transmit) RX=接收(Receive)
- 全双工异步通信
全双工通信:发送和接收可以同时进行
单工通信:数据只能沿一个方向传输
半双工通信:数据可以沿两个方向传输,但需要分时进行
异步通信:没有时钟信号,通过在数据信号中加入起始位和停止位等一些同步信号
同步通信:双方共用同一个时钟信号
- 常用于调试打印,和蓝牙/GPS/WiFi模块通信
通信参数
- 波特率:每秒传多少位数据
- 数据帧格式:[空闲-高电平]->[起始位-1位]->[数据位-8位]->[停止位-1位]->[空闲-高]
起始位:拉低,开始传
数据位:8位,真正的数据,先传低位
停止位:拉高,传完了
USART vs UART
USART = 通用同步异步收发器(多了同步能力S,带SCLK时钟线)
UART = 通用异步收发器(只有异步)
STM32的USARTx平时当UART用(异步),同步模式像SPI,较少用
STM32 USART引脚
USART1挂载在APB2上,72MHz最常用
USART2挂载在APB1上,36MHz
USART3挂载在APB1上,36MHz
配置步骤
- 开时钟:GPIO+USART
- GPIO初始化:TX为复用推挽输出,RX用上拉输入
- 配置USART:波特率,数据位,停止位,校验,收发模式,硬件控流
- 使能USART:USART_Cmd
- 发送接收数据
- (可选)中断接收:USART_ITConfig开启RXNE中断 + 配置NVIC
串口数据包
为什么要有数据包?
单字节发送无法区分"一个完整的数据",数据包给数据加包头包尾,接收方按帧解析
固定帧(江协例程)
格式:FF包头 + 4字节数据 + FF包尾
- 包头0xFF标记一帧开始,包尾0xFF标记结束(FE风格)
- 接收状态机:RxState 0→1→2,逐字节判断包头→存数据→认包尾
可变帧
格式:@ + 数据 + \r\n
- @标记开始,\r\n标记结束
- 适合文本命令,如"@1234\r\n"
固定帧 vs 可变帧
| 固定帧 | 可变帧 | |
|---|---|---|
| 包头包尾 | 0xFF / 0xFE | @ / \r\n |
| 适合 | 二进制数据(传感器值) | 文本命令 |
| 长度 | 固定 | 可变 |