STM32串口中断接收多个字节存入缓冲区
时间: 2025-04-28 10:31:01 浏览: 58
### 使用 STM32 实现串口中断接收多字节数据并存储到缓冲区
为了实现STM32通过串口中断接收多个字节并将它们存入缓冲区的功能,可以采用环形缓冲区的方式。这种方式不仅提高了效率还减少了内存浪费。下面是一个具体的实现方法以及相应的代码示例。
#### 初始化配置
初始化阶段需设置好USART参数,并开启IDLE线状态检测功能以便于识别传输结束。同时要使能对应的中断源,确保每次接收到新字符时都能触发相应动作[^1]。
```c
// 配置UART结构体
static void MX_USARTx_UART_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600; // 设置波特率
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK){
Error_Handler();
}
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE); // 开启空闲中断
}
```
#### 中断服务程序设计
当中断发生时,ISR(Interrupt Service Routine)会被调用,在这里读取已到达的数据直到遇到空闲条件为止。每获取一字节便将其加入至预先定义好的循环队列中去[^4]。
```c
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART2){
uint8_t ch;
while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE)){
ch=huart2.Instance->DR & (uint8_t)0xFF;
// 将接收到的数据放入环形缓存器
ringbuffer_add_char(ch);
// 清除标志位准备下一次接收
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
}
// 继续等待下一个字符的到来
HAL_UART_Receive_IT(&huart2,&ch,1);
}
}
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
if(huart->ErrorCode&HAL_UART_ERROR_FE || huart->ErrorCode&HAL_UART_ERROR_ORE ||
huart->ErrorCode&HAL_UART_ERROR_NE ){
// 处理错误情况...
}
}
```
#### 环形缓冲区操作函数
创建两个简单的辅助函数用于向环形缓冲区内添加元素和从中取出元素。这有助于简化主逻辑中的数据处理流程。
```c
#define BUFFER_SIZE 128
volatile static char rx_buffer[BUFFER_SIZE];
volatile static int head = 0,tail = 0;
int ringbuffer_is_empty(){
return tail == head ? 1 : 0;
}
void ringbuffer_add_char(char cdata){
rx_buffer[head++] = cdata;
if(head >= BUFFER_SIZE) head -= BUFFER_SIZE;
}
char ringbuffer_get_char(){
if(tail!=head){
char res = rx_buffer[tail++];
if(tail>=BUFFER_SIZE)tail-=BUFFER_SIZE;
return res;
}else{return '\0';}
}
```
上述代码展示了如何使用STM32单片机配合环形缓冲区技术完成串口多字节数据的安全可靠接收过程。需要注意的是实际应用场景可能更加复杂,因此还需要针对特定需求调整相关细节[^2]。
阅读全文
相关推荐
















