| @@ -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(); | |||
| } | |||
| } | |||