5

我看到 HAL 提供了以下函数来接收带有中断的串行数据:HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
它基本上设置了 rx 中断和返回。
HAL_UART_RxCpltCallback()一旦接收到的字节数达到Size.
HAL 在执行此回调之前禁用 rx 中断

问题:
传入字节的数量将是可变的(从 1 到 ~100),我需要将它们放入环形缓冲区。
所以我设置Size为 1 并HAL_UART_Receive_IT()在回调中再次调用以重新启用中断,如果板子不时发送 1 或 2 个字节,它会很好地工作,但超出的字节会丢失

我的猜测是它们被错过了,因为它们在中断禁用之间到达 - 启用

有没有办法让中断永远运行而不会覆盖 HAL Cube 生成的代码?
如果不是,那么覆盖所涉及功能的干净方法是什么?
有什么我遗漏的东西可以避免需要找到这个解决方案吗?

4

4 回答 4

2

尝试这个

__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
于 2017-02-11T22:20:03.573 回答
2

带有 DMA(用于接收)的循环缓冲区似乎是满足您要求的解决方案。这将始终提供 RX 中断(您只需配置一次)。

对于类似的要求,通常我使用 1 字节的循环缓冲区来处理数据。接收处理将在 ISR 中完成。

于 2018-06-04T19:48:47.877 回答
0

我认为您必须输入一个特殊字符来指示按摩的结束,或者您制作自己的协议,例如消息头、消息长度、内容、校验和,然后将中断启用一个字节并在中断处理程序中存储接收缓冲区,直到找到消息中的最后一个字节,然后在 RTOS 的情况下发送到主任务,或设置全局标志。顺便确保在

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

里面

HAL_UART_RxCpltCallback

请检查它的返回HAL_UART_Receive_IT可能会返回错误并执行

void HAL_UART_ErrorCallback(UART_HandleTypeDef *UartHandle);

并检查 UART 总线是否有错误。

于 2016-12-31T21:57:50.473 回答
0

您可以通过轮询方法而不是中断方法尝试 UART。轮询方式:UART 接收到“Size”参数指定的数据量后才会返回。

于 2016-05-11T10:44:09.017 回答