stm32串口接收不定长度字节
时间: 2025-02-09 11:50:29 浏览: 21
STM32实现串口接收不定长度数据的方法
使用空闲中断方式
为了在STM32上实现串口接收不定长度的数据,可以依赖于串口空闲(idle)中断机制。这种方式不关心接收到的具体字节数量;当中断发生时,意味着Rx引脚检测到一段时间内没有新的数据传入,从而判断当前数据包已经完整接收完毕[^1]。
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
static void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能IDLE线中断
while (1)
{
if (__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE))
{
uint8_t temp[1];
int i=0;
while(HAL_UART_Receive(&huart1,temp,1,1)!= HAL_TIMEOUT)//读取最后一个未读字符并清空RXNE标志位
;
while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE))//读取剩余所有字符直到RXNE为空
{
rx1_buffer[i++]=temp[0];
HAL_UART_Receive(&huart1,temp,1,1);
}
rec1_end_flag = 1;//设置结束标志
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除IDLE标志位以便下次触发
}
if(rec1_end_flag){
ProcessReceivedData(rx1_buffer,i);
rec1_end_flag = 0;
}
}
}
上述代码展示了如何配置UART外设以及编写主循环来处理由空闲中断引发的数据接收事件。每当检测到一段完整的消息到达之后就会调用ProcessReceivedData()
函数来进行进一步解析或响应操作。
结合DMA的方式提高效率
对于更高效地处理大量连续到来的信息流,则可考虑采用DMA传输模式配合空闲中断一起工作。这样可以在后台自动完成大批量数据搬运的同时利用CPU去做其他事情,减少因频繁查询状态寄存器所带来的开销[^4]。
需要注意的是,在使用DMA进行大容量数据交换时要确保分配给它的缓冲区大小足够容纳预期中的最大可能输入尺寸以免造成溢出错误。
阅读全文
相关推荐


















