Просмотр исходного кода

修改了IDLE重复重启DMA的bug

deepseek
ywh 1 месяц назад
Родитель
Сommit
dc8b337b2e
1 измененных файлов: 8 добавлений и 36 удалений
  1. +8
    -36
      Modbus/Src/modbus_rtu_slave.c

+ 8
- 36
Modbus/Src/modbus_rtu_slave.c Просмотреть файл

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


Загрузка…
Отмена
Сохранить