stm32单片机串口发送
时间: 2025-08-19 14:28:01 浏览: 3
### STM32单片机串口发送数据实现方法
STM32单片机的串口通信功能可以通过多种方式实现数据的发送,常见的有轮询模式、中断模式以及DMA模式。以下是每种模式的具体说明及其对应的示例代码。
#### 轮询模式下的串口发送
在这种模式下,程序会不断检查UART状态寄存器中的标志位来判断是否可以继续发送下一个字节。这种方式简单易懂,但效率较低,因为CPU需要频繁查询状态寄存器[^1]。
```c
#include "usart.h"
void UART_SendByte(uint8_t data) {
while (!(USART_SR(USART1) & USART_FLAG_TXE)); // 等待直到发送缓冲区为空
USART_DR(USART1) = (data & 0xFF); // 将数据写入发送缓冲区
}
void UART_SendString(const char *str) {
while (*str != '\0') { // 遍历字符串直至结束符
UART_SendByte(*str++); // 发送当前字符并移动到下一字符
}
}
```
---
#### 中断模式下的串口发送
当启用中断模式时,一旦TXE(传输完成事件)发生,则触发相应的中断服务函数执行后续处理逻辑。这样可以让处理器去做其他事情而无需等待整个消息被逐个字符地传输出去。
```c
#include "stm32f1xx_hal.h"
volatile uint8_t tx_done_flag = 0;
// 初始化配置部分省略...
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance == USART1){
tx_done_flag = 1; // 设置传输完成标记
}
}
uint8_t send_data[] = "Hello, world!";
HAL_StatusTypeDef ret_val;
ret_val = HAL_UART_Transmit_IT(&huart1,send_data,strlen((char*)send_data));
if(ret_val != HAL_OK){
Error_Handler(); // 错误处理机制
}else{
while(!tx_done_flag){} // 循环等待直到全部数据都已发出
tx_done_flag=0; // 清除标志以便下次使用
}
```
---
#### DMA模式下的串口发送
对于大数据量或者实时性强的任务来说,采用DMA方式进行批量数据传送无疑是最优的选择之一。它允许外设直接访问内存单元从而减轻了MCU核心的工作负担[^2]。
```c
#include "stm32f1xx_hal.h"
#define BUFFER_SIZE 64
uint8_t buffer[BUFFER_SIZE];
int main(void){
MX_DMA_Init();
MX_USART1_UART_Init();
memset(buffer,'A',BUFFER_SIZE);
if(HAL_UART_Transmit_DMA(&huart1,(uint8_t *)buffer,BUFFER_SIZE)!= HAL_OK ){
/* Transfer error in transmission process */
Error_Handler();
}
while (1){}
}
/* 可选:如果需要知道何时DMA传输完毕可定义回调函数*/
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart){
// 半包传输完成后调用此函数
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
// 整包传输完成后调用此函数
}
```
以上三种方法各有特点,在实际应用中可以根据需求选择合适的方式来进行串口数据的发送操作[^3]。
阅读全文
相关推荐




















