有没有办法在 stm32 上不使用"while"来uart_recieve?



我想使用UART_receive接收数据。但是,如果while语句中未包含UART_Receive,则数据将无法正确接收。

当uart发生时,我不想对执行某些事件和其他代码施加限制。

当uart在任何时候发生时,有什么方法可以获取数据吗?

我目前正在使用UART_RECEIVE_DMA。

我可以建议您使用UART空闲中断

void My_UART_IRQHandler(UART_HandleTypeDef *huart)
{
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE))
{
__HAL_UART_CLEAR_IDLEFLAG(huart);
// data is stored in uartData
}
}

void InitUART(void)
{
__HAL_UART_ENABLE_IT(&huart, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart, uartData, size);
}

转到stm32xxxx_it.c中的USARTx_IRQHandler,并添加调用My_UART_IRQHandler:

void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */

/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
My_UART_IRQHandler(&huart1);
/* USER CODE END USART1_IRQn 1 */
}

不要忘记启用UART中断并使用DMA进行UART TX

可以通过三种方式接收UART数据。

  • 轮询
  • 中断
  • DMA

当UART信号发生时,DMA或中断UART接收方法可以随时触发。因此使用UART_ RECEIVE_;当uart发生时对执行某些事件和其他代码施加限制";对我来说有点奇怪。

在DMA方法中,您不需要调用UART来接收while((循环。对于学习和接收固定长度的数据,可以尝试此资源。

如果数据长度未知,可以使用IDLE行检测。使用控制器技术的此资源了解更多详细信息。

一种方法是基于中断的循环FIFO队列。

发出一个字节(或更多(的接收调用,当调用中断服务例程时,将字节/秒填充到FIFO中,然后处理其间的数据。

这使得数据接收可以快速完成,因此您可以做其他看起来令人担忧的事情。

如果你担心为其他外设提供服务,你可能想采用实时操作系统或基于优先级的中断的先发制人的方法。这将使您能够控制服务的确切时间。

相关内容

  • 没有找到相关文章

最新更新