串口通信 (HAL)
一、扫描模式
UART:通用异步收发器
USART:通用同步/异步收发器,其可选使用异步方式,那将和UART无区别,如果是同步,则需要多一根时钟线(USART_CK)
CubMAX配置介绍:
模式选择:
Asynchronous 异步通信
Synchronous 同步通信
Single Wire (Half-Duplex) 单线/半双工
Multiprocessor Communication 多处理器
支持局域互连网络LIN、智能卡(SmartCard)协议与lrDA(红外线数据协会) SIR ENDEC规范。
基础参数:波特率为9600Bits/s,传输数据长度为8 Bit,奇偶检验无,停止位1
HAL库函数
串口发送函数:
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。
参数:
- UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
- *pData 需要发送的数据
- Size 发送的字节数
- Timeout 最大发送时间,发送数据超过该时间退出发送
串口接收函数:
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
功能:串口接受指定长度的数据。如果超时没接受完成,则不再接受,返回超时标志(HAL_TIMEOUT)。
参数:
- UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
- *pData 需要接受的数据
- Size 发送的字节数
- Timeout 最大接受时间,接受数据超过该时间退出接受
代码
全局:
char RxBuffer[100]; //接收数据 char TxBuffer[100] = {0x50}; //发送数据
main:
HAL_UART_Transmit(&huart3,(uint8_t *)TxBuffer,1,0xffff);
while:
HAL_UART_Receive(&huart3,(uint8_t *)RxBuffer,3,0xffff);// 接收3个字符 if(RxBuffer[0] != 0) { HAL_UART_Transmit(&huart3,(uint8_t *)RxBuffer,3,0xffff);// 发送3个字符 memset(RxBuffer,0,sizeof(RxBuffer)); }
memset函数需要在添加#include "string.h"
串口助手演示效果:
符合预计效果
二、中断模式
CubMAX配置介绍:
Preemption Priorit:抢占优先级
Sub Priority :子优先级
数字越小优先级越高
自动生成的代码中已经使能了中断
函数
中断接收数据:
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
功能:串口中断接收,以中断方式接收指定长度数据。
大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。接收到数据时,会触发串口中断。
再然后,串口中断函数处理,直到接收到指定长度数据,而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)
参数:
- UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
- *pData 接收到的数据存放地址
- Size 接收的字节数
中断接收回调函数:
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
功能:HAL库的中断进行完之后,并不会直接退出,而是会进入中断回调函数中,用户可以在其中设置代码,
串口中断接收完成之后,会进入该函数,该函数为空函数,用户需自行修改,
参数:
UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
代码:
全局:
char RxBuffer[100]; //接收数据
main:
/* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart3,(uint8_t *)RxBuffer,1);//开启串口接受中断 /* USER CODE END 2 */
全局:
/* USER CODE BEGIN 4 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART3)//判断串口号 { HAL_UART_Transmit(&huart3,(uint8_t *)RxBuffer,1,0xffff); HAL_UART_Receive_IT(&huart3,(uint8_t *)RxBuffer,1);//再次开启 } } /* USER CODE END 4 */
串口助手演示效果:
可以实现串口中断
三、DMA收发模式
STM32可用DMA的外设:定时器、ADC、SPI、IIC、USART
使用DMA必须开启中断
串口DMA模式最大为u16个字节,则65535
CubMAX配置介绍:
mode:模式
Normal:正常模式,当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次
Circular: 循环模式,传输完成后又重新开始继续传输,不断循环永不停止
Increment Address:地址增加
Peripheral:设置传输数据的时候外设地址是不变还是递增。如果设置为递增,那么下一次传输的时候地址加 Data Width个字节,勾选表示递增。
Memory: 设置传输数据时候内存地址是否递增。如果设置为递增,那么下一次传输的时候地址加 Data Width个字节,这个是内存,勾选表示递增。
函数:
串口DMA发送:
HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
串口DMA接受:
HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
代码:
main:
HAL_UART_Receive_DMA(&huart3,(uint8_t *)RxBuffer,10);//设置串口DMA缓冲区
全局:
/* USER CODE BEGIN 4 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART3)//判断串口号 { HAL_UART_Transmit_DMA(&huart3,(uint8_t *)RxBuffer,10); } } /* USER CODE END 4 */
串口助手演示效果:
因为没有做项目,程序非常简单。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」