我看到HAL提供了以下函数来接收带有中断的串行数据:HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
这基本上设置了rx中断和返回。
一旦接收到的字节数达到Size
,就会调用HAL_UART_RxCpltCallback()
。
HAL在执行此回调之前禁用rx中断
问题:
传入字节的数量是可变的(从1到~100),我需要将它们放入环形缓冲区。
因此,我将Size
设置为1,并在回调中再次调用HAL_UART_Receive_IT()
以重新启用中断,如果电路板偶尔收到1或2个字节的发送,它会工作得很好,但会遗漏超过1或2个字节的字节
我的猜测是它们被遗漏了,因为它们是在中断禁用-启用之间到达的
有没有一种方法可以让中断永远运行而不覆盖HAL Cube生成的代码?
如果不是,什么是覆盖相关函数的干净方法?
我是否遗漏了一些东西来避免寻找这个解决方案的需要?
发布于 2017-02-12 06:20:04
尝尝这个
__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
发布于 2018-06-05 03:48:48
具有DMA(用于接收)的循环缓冲区似乎是满足您的需求的解决方案。这将始终提供RX中断(您只需配置它一次)。
对于类似的需求,我通常使用一个1字节的循环缓冲区来处理数据。接收处理将在ISR中完成。
发布于 2016-05-11 18:44:09
您可以通过轮询方法而不是中断方法来尝试UART。轮询方法: UART不会返回,直到它收到"Size“参数指定的数据量。
https://stackoverflow.com/questions/36658544
复制相似问题