接收数据时如何自动调用UART_Receive_IT()?

时间:2019-04-18 09:18:16

标签: stm32 uart freertos

我是STM32和freertos的新手。我需要编写程序以通过UART端口从模块发送和接收数据。我必须将数据发送(发送)到该模块(例如M66)。然后,我将返回执行其他一些任务。一旦M66发送响应,我的seial-port-receive-function(HAL_UART_Receive_IT)必须被调用并接收该响应。我该如何实现?

3 个答案:

答案 0 :(得分:1)

HAL_UART_Receive_IT的工作方式是将其配置为在给定的缓冲区中接收指定数量的数据。您将其提供给缓冲区,缓冲区将读取接收到的数据以及想要接收的字节数。然后,它开始接收数据。接收到恰好此数量的数据后,就会调用回调函数HAL_UART_RxCpltCallback(从IRQ),您可以在其中使用该数据做任何想做的事情,例如将其添加到某种队列中,以便在任务上下文中进行后续处理。

如果我要表达与使用HAL的UART模块相关的经验,那就是它不是通用的最好的模块,因为它不知道您希望预先接收的数据量。对于您提到的M66调制解调器,这将一直发生。

要解决此问题,您有两种选择:

  1. 对于UART,根本不使用HAL函数,除了初始化函数。实现自己的UART中断处理程序(可以从HAL中的处理程序复制大多数代码),在接收数据时,将接收到的字节放置在RTOS任务处理的接收字节队列中。在此任务中,您将实现协议解析。这是我个人使用的方法。

  2. 如果您确实要使用HAL,但也要使用发送不同数量数据的模块,请调用HAL_UART_Receive_IT并指定您希望每次接收1个字节。这会起作用,但是(可能会)比第一种方法慢。假设您以后想要实现一些tcp / ip通信(您提到了M66 GPRS模块),则可能不想这样做。

答案 1 :(得分:0)

您应该尝试以下方式。

在NVIC中启用UARTX Rx中断。 设置中断优先级。 取消屏蔽EXTI中的中断请求。

然后在您的Vector中使用USARTX中断处理程序函数定义。

无论何时从USARTX接收到数据,此函数都会自动调用,您可以从USARTX接收数据寄存器复制数据。

答案 2 :(得分:0)

我宁愿建议另一种方法。您可能希望以更高的速度存档(假设921600 bods),而中断方式实在太慢了。

您需要使用数据端检测功能来实现DMA传输。在DMA模式下以循环模式运行USART。您将要服务两个事件。第一个是DMA结束中断(然后将数据从当前尾指针复制到缓冲区的末尾,以避免数据覆盖)和USART IDLE中断-这将检测接收结束。