ST意法半导体
直播中

卓侨汉

7年用户 1034经验值
擅长:MEMS/传感技术
私信 关注
[问答]

HAL_UART_Receive_IT - 启动函数前如何清理?

亲爱的夫人,先生,
我正在使用带有 STM32 的 Riverdi 探索板。我正在开发一个串行协议,我正在为其使用中断接收。
  • 我在 CubeMx 中启用了 IT
  • 使用 HAL_UART_Receive_IT(),它第一次工作正常,如果所有收到的字符都被读取
  • 如果我重新启动 HAL_UART_Receive_IT() 并且字符在未被读取的情况下被发送到 uart RX 缓冲区,它将无法工作
  • 我让它工作的唯一方法是在它之前添加一个 HAL_UART_Init 函数并且它工作正常。
但我想这不是清理缓冲区、状态和未决中断的最佳方法。你能建议最好的方法吗?

回帖(1)

王淑英

2022-12-6 10:53:56
当您执行第二次接收(失败的接收)时,您可以检查 UART 实例的 ISR(或 SR 寄存器,取决于您使用的 STM32 系列)。可能寄存器中已经存在一些错误,导致无法正确处理接收。我在考虑 Overrun 标志(表示收到了一些数据但没有及时从 RDR 读取)。如果在第一次接收完成后接收到附加数据,则可能会发生这种情况。当这个标志被设置时(一些数据已经丢失),但是在错误被清除的情况下接收被冻结。
如果您的情况发生这种情况,您可以在重新启动第二次接收之前通过重置 ICR(或 CR 寄存器)中的标志来清除标志,例如使用专用宏:
__HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__) 以 UART_CLEAR_OREF 作为标志。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分