| @@ -20,8 +20,6 @@ | |||||
| #define MODBUS_BROADCAST_ADDRESS (0U) | #define MODBUS_BROADCAST_ADDRESS (0U) | ||||
| #define MODBUS_EX_ILLEGAL_FUNCTION (0x01U) | #define MODBUS_EX_ILLEGAL_FUNCTION (0x01U) | ||||
| #define MODBUS_EX_ILLEGAL_ADDRESS (0x02U) | #define MODBUS_EX_ILLEGAL_ADDRESS (0x02U) | ||||
| #define MODBUS_EX_ILLEGAL_VALUE (0x03U) | #define MODBUS_EX_ILLEGAL_VALUE (0x03U) | ||||
| @@ -183,16 +181,7 @@ static HAL_StatusTypeDef ModbusStartReceive(void) | |||||
| return status; | return status; | ||||
| } | } | ||||
| /** | |||||
| * @brief 停止当前 USART DMA 接收。 | |||||
| */ | |||||
| static void ModbusStopReceive(void) | |||||
| { | |||||
| if (ModbusUart != NULL) | |||||
| { | |||||
| (void)HAL_UART_AbortReceive(ModbusUart); | |||||
| } | |||||
| } | |||||
| /** | /** | ||||
| * @brief 在 RTU 帧末尾追加 CRC 低字节和高字节。 | * @brief 在 RTU 帧末尾追加 CRC 低字节和高字节。 | ||||
| @@ -665,25 +654,13 @@ void ModbusSlavePoll(void) | |||||
| return; | return; | ||||
| } | } | ||||
| /* | |||||
| * IDLE 事件在约 1 个字符静默后产生;再等待到 2 ms, | |||||
| * 满足当前 115200 bit/s 下的 Modbus RTU 帧间隔要求。 | |||||
| */ | |||||
| // if ((HAL_GetTick() - ModbusRxEventTick) < MODBUS_RTU_FRAME_GAP_MS) | |||||
| // { | |||||
| // return; | |||||
| // } | |||||
| responseLength = ModbusProcessRequest(ModbusRxFrame, ModbusRxFrameLength); | responseLength = ModbusProcessRequest(ModbusRxFrame, ModbusRxFrameLength); | ||||
| if (responseLength > 0U) | if (responseLength > 0U) | ||||
| { | { | ||||
| /* | |||||
| * 发送期间停止接收 | |||||
| * | |||||
| */ | |||||
| ModbusStopReceive(); | |||||
| ModbusTxBusy = 1U; | ModbusTxBusy = 1U; | ||||
| if (HAL_UART_Transmit_DMA(ModbusUart, | if (HAL_UART_Transmit_DMA(ModbusUart, | ||||
| @@ -699,9 +676,12 @@ void ModbusSlavePoll(void) | |||||
| (void)ModbusStartReceive();//重启DMA接收 | (void)ModbusStartReceive();//重启DMA接收 | ||||
| } | } | ||||
| } | } | ||||
| else | |||||
| { | |||||
| (void)ModbusStartReceive(); | |||||
| } | |||||
| /* | /* | ||||
| * 处理期间保持 ModbusRxFrameReady 为 1,使中断不会覆盖 | |||||
| * 当前帧;处理完成后再释放帧槽。 | * 当前帧;处理完成后再释放帧槽。 | ||||
| */ | */ | ||||
| ModbusRxFrameReady = 0U; | ModbusRxFrameReady = 0U; | ||||
| @@ -709,10 +689,6 @@ void ModbusSlavePoll(void) | |||||
| void ModbusSlaveOnRxEvent(UART_HandleTypeDef *huart, uint16_t size) | void ModbusSlaveOnRxEvent(UART_HandleTypeDef *huart, uint16_t size) | ||||
| { | { | ||||
| if ((huart != ModbusUart) || (ModbusUart == NULL)) | |||||
| { | |||||
| return; | |||||
| } | |||||
| ModbusSlaveStatistics.rxEventCount++;//串口接收事件计数 | ModbusSlaveStatistics.rxEventCount++;//串口接收事件计数 | ||||
| @@ -727,18 +703,14 @@ void ModbusSlaveOnRxEvent(UART_HandleTypeDef *huart, uint16_t size) | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| /* 单帧槽尚未处理完成,丢弃新帧而不覆盖旧帧。 */ | |||||
| //前一帧未处理完毕 | |||||
| ModbusSlaveStatistics.droppedFrameCount++; | ModbusSlaveStatistics.droppedFrameCount++; | ||||
| } | } | ||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| //长度异常帧 | |||||
| ModbusSlaveStatistics.droppedFrameCount++; | ModbusSlaveStatistics.droppedFrameCount++; | ||||
| } | |||||
| /* DMA 普通模式在 IDLE 事件后停止,需要重新启动。 */ | |||||
| if (ModbusTxBusy == 0U) | |||||
| { | |||||
| (void)ModbusStartReceive(); | (void)ModbusStartReceive(); | ||||
| } | } | ||||
| } | } | ||||