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

问题描述 投票:0回答:3

我是STM32和freertos的新手。我需要编写一个程序,通过UART端口从模块发送和接收数据。我必须向该模块发送(传输)数据(例如,M66)。然后我会回去做其他一些任务。一旦M66发送响应,我的seial-port-receive-function(HAL_UART_Receive_IT)就必须被调用并接收该响应。我怎样才能做到这一点?

stm32 uart freertos
3个回答
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模块),您可能不希望这样做。

0
投票

你应该尝试以下方式。

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

然后在向量中使用USARTX中断处理程序函数定义。

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


0
投票

我宁愿建议另一种方法。你可能想要存档更高的速度(比方说921600 bods),并且中断方式对它来说很慢。

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

© www.soinside.com 2019 - 2024. All rights reserved.