我想使用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中,然后处理其间的数据。
这使得数据接收可以快速完成,因此您可以做其他看起来令人担忧的事情。
如果你担心为其他外设提供服务,你可能想采用实时操作系统或基于优先级的中断的先发制人的方法。这将使您能够控制服务的确切时间。