微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可变长度数据如何实现UART Rx中断例程?

如何解决可变长度数据如何实现UART Rx中断例程?

我有一个定制的 STM32F4 MCU 板。我需要从 RS485 n/w 中的主板接收不同类型的序列。要接收的数据长度是可变的,比如 10 字节、25 字节等等。我必须处理每个序列并做出相应的响应。

如何正确使用HAL函数HAL_UART_Receive_ITHAL_UART_RxCpltCallback来正确接收变量数据? >

我看到 HAL_UART_Receive_IT 的第三个参数正在寻找要修复的字节数,如图所示:

HAL_UART_Receive_IT(&huart1,&uart1_rx_byte,no_of_bytes);

请提出一个好的实施方案...

接收帧格式:
|起始字节 |从地址 |字节数 |功能。身份证 |数据1 |数据 2 |...|数据 n|校验和字节 1 |校验和字节 2 |

其中字节数 = 否。来自 Func 的字节数。 ID 到校验和字节 2

解决方法

如果您的通信速度相对于 MCU 时钟速度较慢并且您的 MCU 无事可做,您可以按照@codo 在评论中的建议进行两部分接收(前 3 个字节获取数据包长度,然后接收 n来自数据包头的字节)。如果您正在繁忙的系统上寻找更高的速度,这将很快崩溃。另一个警告可能是数据包长度字节中的位翻转会破坏您的消息。

您坚持使用 IT 并避免使用 DMA 似乎有点奇怪,因为它实际上使您的 MCU 在 UART 外设和它正在执行的任何其他操作之间抽搐(不要被“接收 n 个字节”所迷惑-它仍然会产生每个字节上的 IRQ,因为外设有单个数据寄存器,只是 IRQ 处理和内存指针的推进被 HAL 隐藏了)。只有当整个数据包到达时,使用 DMA 接收才会触发 IRQ。将 DMA 设置为最大数据包大小限制和 UART_IDLE 或基于定时器的空闲检测(如果您的命令源没有提供良好的定时字节),您可以在整个数据包到达后对其进行处理。

我正在使用 UART_IDLE IRQ 和 DMA,频率为 8Mbaud,频率为 180MHz,FreeRTOS 和其他一些对时间敏感的事情正在发生。在 8Mbaud,每字节只有大约 200 个周期来处理消息,因此 IT 驱动的方法效果不佳(上下文切换、HAL 开销等)。我也有打包的结构,类似于你的。每个数据包都会根据长度和 CRC 进行验证。遗憾的是,UART_IDLE IRQ 处理是 ST HAL 中未实现的内容之一,因此您必须自己实现。

,

请看一下本教程:

http://www.bepat.de/2020/12/02/stm32f103c8-uart-with-dma-buffer-and-idle-detection/

您必须为 F4 稍微调整一下,用于计算 RX-Buffer 中数据的正确寄存器是

huart->hdmarx->Instance->NDTR

/wo "C"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。