From dc8b337b2e0e3632b6a96a1207147bd7971e3583 Mon Sep 17 00:00:00 2001 From: ywh <2227158009@qq.com> Date: Wed, 29 Jul 2026 09:05:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86IDLE=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E9=87=8D=E5=90=AFDMA=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modbus/Src/modbus_rtu_slave.c | 44 +++++++---------------------------- 1 file changed, 8 insertions(+), 36 deletions(-) diff --git a/Modbus/Src/modbus_rtu_slave.c b/Modbus/Src/modbus_rtu_slave.c index 1f166b3..c4a6dce 100644 --- a/Modbus/Src/modbus_rtu_slave.c +++ b/Modbus/Src/modbus_rtu_slave.c @@ -20,8 +20,6 @@ #define MODBUS_BROADCAST_ADDRESS (0U) - - #define MODBUS_EX_ILLEGAL_FUNCTION (0x01U) #define MODBUS_EX_ILLEGAL_ADDRESS (0x02U) #define MODBUS_EX_ILLEGAL_VALUE (0x03U) @@ -183,16 +181,7 @@ static HAL_StatusTypeDef ModbusStartReceive(void) return status; } -/** - * @brief 停止当前 USART DMA 接收。 - */ -static void ModbusStopReceive(void) -{ - if (ModbusUart != NULL) - { - (void)HAL_UART_AbortReceive(ModbusUart); - } -} + /** * @brief 在 RTU 帧末尾追加 CRC 低字节和高字节。 @@ -665,25 +654,13 @@ void ModbusSlavePoll(void) return; } - /* - * IDLE 事件在约 1 个字符静默后产生;再等待到 2 ms, - * 满足当前 115200 bit/s 下的 Modbus RTU 帧间隔要求。 - */ - // if ((HAL_GetTick() - ModbusRxEventTick) < MODBUS_RTU_FRAME_GAP_MS) - // { - // return; - // } + responseLength = ModbusProcessRequest(ModbusRxFrame, ModbusRxFrameLength); if (responseLength > 0U) { - /* - * 发送期间停止接收 - * - */ - ModbusStopReceive(); ModbusTxBusy = 1U; if (HAL_UART_Transmit_DMA(ModbusUart, @@ -699,9 +676,12 @@ void ModbusSlavePoll(void) (void)ModbusStartReceive();//重启DMA接收 } } + else + { + (void)ModbusStartReceive(); + } /* - * 处理期间保持 ModbusRxFrameReady 为 1,使中断不会覆盖 * 当前帧;处理完成后再释放帧槽。 */ ModbusRxFrameReady = 0U; @@ -709,10 +689,6 @@ void ModbusSlavePoll(void) void ModbusSlaveOnRxEvent(UART_HandleTypeDef *huart, uint16_t size) { - if ((huart != ModbusUart) || (ModbusUart == NULL)) - { - return; - } ModbusSlaveStatistics.rxEventCount++;//串口接收事件计数 @@ -727,18 +703,14 @@ void ModbusSlaveOnRxEvent(UART_HandleTypeDef *huart, uint16_t size) } else { - /* 单帧槽尚未处理完成,丢弃新帧而不覆盖旧帧。 */ + //前一帧未处理完毕 ModbusSlaveStatistics.droppedFrameCount++; } } else { + //长度异常帧 ModbusSlaveStatistics.droppedFrameCount++; - } - - /* DMA 普通模式在 IDLE 事件后停止,需要重新启动。 */ - if (ModbusTxBusy == 0U) - { (void)ModbusStartReceive(); } }