2026-03-20 21:16:58 +08:00
|
|
|
|
#include "../main/SystemInclude.h"
|
|
|
|
|
|
|
|
|
|
|
|
const u32 baudRateVaule[6] ={4800, 9600, 19200, 38400, 57600, 115200};
|
|
|
|
|
|
|
|
|
|
|
|
COM_DATA_TypeDef comState;
|
|
|
|
|
|
|
|
|
|
|
|
void StartDMAForRxdMainUartData(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifndef ENABLE_TURN_OFF_RS485
|
|
|
|
|
|
#pragma message("[undefined] ENABLE_TURN_OFF_RS485")
|
|
|
|
|
|
#elif(ENABLE_TURN_OFF_RS485)
|
|
|
|
|
|
RS485_Enable_RX();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
comState.state.ReceivedData = 0 ; //<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־
|
|
|
|
|
|
comState.state.SendingData = 0 ; //<2F><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD>б<EFBFBD>־
|
|
|
|
|
|
DMA_UART_AnyLength_Rx_Init(baudRateVaule[baudRate]);//<2F><>ʼ<EFBFBD><CABC>UART DMA<4D><41><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
comState.state.ReceivedData = 0 ;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void DMAForUART_Tx_Callback(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
comState.state.SendingData = 0 ; //UART DMA<4D><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
LHL_DMA_Stop(&DMA_Handle_UartTx); //<2F>ر<EFBFBD>DMA<4D><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
RestartDMAForRxdMainUartData(); //<2F>л<EFBFBD><D0BB>ؽ<EFBFBD><D8BD><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void StartDMAForTxdMainUartData(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
LHL_DMA_Stop(&DMA_Handle_UartRx);//<2F>ر<EFBFBD>DMA<4D><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef ENABLE_TURN_OFF_RS485
|
|
|
|
|
|
#pragma message("[undefined] ENABLE_TURN_OFF_RS485")
|
|
|
|
|
|
#elif(ENABLE_TURN_OFF_RS485)
|
|
|
|
|
|
RS485_Enable_TX();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
comState.state.SendingData = 1 ;
|
|
|
|
|
|
comState.TxLenth = MBBuf.TxdLen;
|
|
|
|
|
|
// memcpy(comState.TxdData, MBBuf.TxPointer, comState.TxLenth );
|
|
|
|
|
|
|
|
|
|
|
|
// for (u8 i=0;i<comState.TxLenth;i++) printf("%c",comState.TxdData[i]);
|
|
|
|
|
|
DMA_UART_Tx_Init();//<2F><>ʼ<EFBFBD><CABC>DMA <20><><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|
|
|
|
|
DMA_register_irq_callback(DMA_CHANNEL_UART_Tx,NULL,DMAForUART_Tx_Callback);//ע<>ᴫ<EFBFBD><E1B4AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void RestartDMAForRxdMainUartData(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifndef ENABLE_TURN_OFF_RS485
|
|
|
|
|
|
#pragma message("[undefined] ENABLE_TURN_OFF_RS485")
|
|
|
|
|
|
#elif(ENABLE_TURN_OFF_RS485)
|
|
|
|
|
|
RS485_Enable_RX();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
comState.state.ReceivedData = 0 ;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
|
|
|
|
|
|
|
|
|
|
|
|
DMA_DMAMUX_CFG(DMA_CHANNEL_UART_Rx,REQUEST_SOURCE_UART_RX);//<2F><>DMAMUX<55><58><EFBFBD>ӻص<D3BB><D8B5><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>ͨ<EFBFBD><CDA8>
|
|
|
|
|
|
DMA_Handle_UartRx.Init.Dest_Address = (uint32_t)comState.RxdData;//<2F><><EFBFBD><EFBFBD>DMAĿ<41><C4BF><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
|
|
|
|
|
LHL_DMA_GenerateTCD(&DMA_Handle_UartRx, &DMA_Handle_UartRx.Init, (DMA_DES_N_TypeDef *)(DMA_DES_N_BASE + 32u * DMA_Handle_UartRx.Channel)); /* д<><D0B4>DMA<4D>Ĵ<EFBFBD><C4B4><EFBFBD> */
|
|
|
|
|
|
|
|
|
|
|
|
LHL_DMA_Start(&DMA_Handle_UartRx); /*<2A><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>*/
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//void RestartDMAForTxdMainUartData(void)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// LHL_DMA_Stop(&DMA_Handle_UartRx);//<2F>ر<EFBFBD>DMA<4D><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// comState.state.SendingData = 1 ;
|
|
|
|
|
|
// comState.TxLenth = MBBuf.TxdLen;
|
|
|
|
|
|
// memcpy(comState.TxdData, MBBuf.TxPointer, comState.TxLenth );
|
|
|
|
|
|
//
|
|
|
|
|
|
// DMA_Handle_UartTx.Init.Src_Address = (uint32_t)&comState.TxdData; // Դ<><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// DMA_Handle_UartTx.Init.Repetition = comState.TxLenth ;
|
|
|
|
|
|
// LHL_DMA_GenerateTCD(&DMA_Handle_UartTx, &DMA_Handle_UartTx.Init, (DMA_DES_N_TypeDef *)(DMA_DES_N_BASE + 32u * DMA_Handle_UartTx.Channel)); /* д<><D0B4>DMA<4D>Ĵ<EFBFBD><C4B4><EFBFBD> */
|
|
|
|
|
|
// LHL_DMA_Start(&DMA_Handle_UartTx);
|
|
|
|
|
|
// DMA_register_irq_callback(DMA_CHANNEL_UART_Tx,NULL,DMAForUART_Tx_Callback);//ע<>ᴫ<EFBFBD><E1B4AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
void ReceivedDataProcessing(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
comState.state.ReceivedData = 0 ; //<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־
|
|
|
|
|
|
Get_UART_Rx_ActualLength();//<2F><><EFBFBD>½<EFBFBD><C2BD>ճ<EFBFBD><D5B3><EFBFBD>
|
|
|
|
|
|
MBBuf.RxdLen = comState.RxLenth; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|
|
|
|
|
MBBuf.RxPointer = comState.RxdData; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2026-03-20 21:19:04 +08:00
|
|
|
|
MBBuf.TxPointer = comState.TxdData; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if(ModBusProtocolDetection()) //<2F><><EFBFBD>ModbusЭ<73><D0AD>
|
2026-03-20 21:16:58 +08:00
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
ModBusDataProcessing(); //Э<>鴦<EFBFBD><E9B4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Э<>鴦<EFBFBD><E9B4A6><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MBBuf.RxPointer<65><72>
|
|
|
|
|
|
|
|
|
|
|
|
// MBBuf.TxPointer = MBBuf.RxPointer ;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
StartDMAForTxdMainUartData(); //<2F>ظ<EFBFBD>֡
|
2026-03-20 21:16:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
else RestartDMAForRxdMainUartData();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD>(<28>ܹ<EFBFBD>ʹͨ<CAB9><CDA8>ʧ<EFBFBD><CAA7>ʱ<EFBFBD><CAB1><EFBFBD>¸<EFBFBD>λ)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*********************************************************************************************************************************************/
|
|
|
|
|
|
/* <20><>RS485<38>Ŀ<EFBFBD><C4BF><EFBFBD> */
|
|
|
|
|
|
/*********************************************************************************************************************************************/
|
|
|
|
|
|
#ifndef ENABLE_TURN_OFF_RS485
|
|
|
|
|
|
#pragma message("[undefined] ENABLE_TURN_OFF_RS485")
|
|
|
|
|
|
#elif(ENABLE_TURN_OFF_RS485)
|
|
|
|
|
|
void RS485_Enable_TX(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
RS485DE_OUTPUT();
|
|
|
|
|
|
ENABLE_TXD();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void RS485_Enable_RX(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
RS485DE_OUTPUT();
|
|
|
|
|
|
ENABLE_RXD();
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|