Преглед на файлове

修改了IDLE重复重启DMA的bug

deepseek
ywh преди 1 месец
родител
ревизия
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_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();
}
}


Зареждане…
Отказ
Запис