From 102c56496288b3ab69ceb2f83780ee7e67f22bc3 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 23 Nov 2023 15:39:25 +0800 Subject: [PATCH] fix zuart dma receiver bug --- components/hardware/uart/zuart_dma_receiver.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/components/hardware/uart/zuart_dma_receiver.cpp b/components/hardware/uart/zuart_dma_receiver.cpp index ebf3b7b..ae9a6f9 100644 --- a/components/hardware/uart/zuart_dma_receiver.cpp +++ b/components/hardware/uart/zuart_dma_receiver.cpp @@ -26,7 +26,7 @@ void ZUARTDmaReceiver::startRx(callback_t cb) { } int32_t ZUARTDmaReceiver::gertRxBufSize() { return m_rxbufsize; } -void ZUARTDmaReceiver::periodJOBIrq() { // +void ZUARTDmaReceiver::periodJOBIrq() { // if (!m_dmaisstart) return; @@ -36,11 +36,19 @@ void ZUARTDmaReceiver::periodJOBIrq() { // m_lastrxticket = zos_get_tick(); } - if (zos_haspassedms(m_lastrxticket) > m_hw_config.rxovertime_ms) { - if (m_cb) m_cb(m_rxbuf, m_rxlen); - - m_rxlen = 0; - HAL_UART_DMAStop(m_hw_config.huart); - HAL_UART_Receive_DMA(m_hw_config.huart, (uint8_t *)m_rxbuf, m_rxbufsize); + if (m_rxlen != 0) { + if (zos_haspassedms(m_lastrxticket) > m_hw_config.rxovertime_ms) { + if (m_cb) m_cb(m_rxbuf, m_rxlen); + + m_rxlen = 0; + HAL_UART_DMAStop(m_hw_config.huart); + HAL_UART_Receive_DMA(m_hw_config.huart, (uint8_t *)m_rxbuf, m_rxbufsize); + } + } else { + // 如果DMA接收停止了,重新启动 + if (!(HAL_UART_GetState(m_hw_config.huart) & 0x1)) { + HAL_UART_DMAStop(m_hw_config.huart); + HAL_UART_Receive_DMA(m_hw_config.huart, (uint8_t *)m_rxbuf, m_rxbufsize); + } } }