USART串行通信
USART串行通信
串行通信通常用于连接两个距离较远的物理设备
基本原理
串行通信最常用的通信标准是 RS232C
右边的为更常用的一种
- DSR: 指示数据通信设备是否准备好接受数据
- DTR:数据终端设备准备好
- RTS:请求由DTE向DCE发送数据
- CTS:请求清除发送信号,由DCE发出
- DCD:数据载波检出,表示本地DCE设备收到对方DCE设备的数据,通知DTE设备准备好接收数据
- TxD:发送数据
- RxD:接收数据
- SG,PG:信号地和保护地,实际只用信号地
RS232C的连接
流控和握手
- 无握手:通信双方必须设置同样的通信速率,否则很容易造成接收方数据溢出
- 硬件握手:发送方真正发送数据之前,通过设置RTS为有效通知接收方做好准备,接收方准备好后将CTS置为有效通知已准备好,然后等待数据
- 软件握手:通过特殊字符"XON"和"XOFF"来实现流控
STM32的串行通信模块
分频设置和波特率选择
一切数字电路都需要时钟脉冲的驱动才能工作,波特率与时钟输入信号频率的关系为
USARTDIV是一个无符号的定点数,在BRR寄存器中,第4~15位设置了该定点数的整数部分,0~3位设置了定点数的小数部分。
小数部分除上16加上整数部分就得到了定点数。
常用全双工异步通信的发送配置
全双工异步通信的接收配置
USART常用的库函数
-
USART_Init(USARTx, USART_InitStructure*)
初始化USART模块
-
USART_Cmd(UASRTx, ENABLE)
使能USART
-
USART_SendData(USARTx, u8*);
发送数据
-
USART_GetFlagStatus(UASRTx, USART_FLAG_TXE)
获得相应位的值
发送数据给终端示例
省去麻烦的初始化配置代码
while (NumberOfDataToTransfer--) {
//这里可以看出每次发送数据只能发送一个字节
USART_SendData(USART2, TxBuffer[TxCounter++]);
//这里可以看出每次发送完一个字节后必须等到接收端将TXE RESET位拉低
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
}
从终端接收数据发送给通信端,然后又发送回来
do {
if ((USART_GetFlagStatus(USART2, USART_FLAG_TXNE) != RESET) && (RxCounter < RxBufferSize)) {
RxBuffer[RxCounter] = USART_ReceiveData(USART2);
USART_SendData(USART2, RxBuffer[RxCounter++]);
}
} while ((RxBuffer[RxCounter-1] != '\r') && (RxCounter != RxBufferSize));
WELCOME TO THE MACHINE
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)