Files
CHJ/user/Protocol/CommProcess.c
2026-03-20 21:19:53 +08:00

124 lines
4.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 ; //重置接收完成标志
comState.state.SendingData = 0 ; //重置发送中标志
DMA_UART_AnyLength_Rx_Init(baudRateVaule[baudRate]);//初始化UART DMA接收并开始接收
//接收指针指向接收数组
comState.state.ReceivedData = 0 ;//接收完成标志位
}
void DMAForUART_Tx_Callback(void)
{
comState.state.SendingData = 0 ; //UART DMA发送完成
LHL_DMA_Stop(&DMA_Handle_UartTx); //关闭DMA发送数据
RestartDMAForRxdMainUartData(); //切换回接收
}
void StartDMAForTxdMainUartData(void)
{
LHL_DMA_Stop(&DMA_Handle_UartRx);//关闭DMA接收数据
#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();//初始化DMA 并开始传输
DMA_register_irq_callback(DMA_CHANNEL_UART_Tx,NULL,DMAForUART_Tx_Callback);//注册传输完成中断
}
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 ;//接收完成标志位
DMA_DMAMUX_CFG(DMA_CHANNEL_UART_Rx,REQUEST_SOURCE_UART_RX);//将DMAMUX链接回到串口接收通道
DMA_Handle_UartRx.Init.Dest_Address = (uint32_t)comState.RxdData;//重置DMA目标地址到接收数组起始地址
LHL_DMA_GenerateTCD(&DMA_Handle_UartRx, &DMA_Handle_UartRx.Init, (DMA_DES_N_TypeDef *)(DMA_DES_N_BASE + 32u * DMA_Handle_UartRx.Channel)); /* 写入DMA寄存器 */
LHL_DMA_Start(&DMA_Handle_UartRx); /*开始接收*/
}
//void RestartDMAForTxdMainUartData(void)
//{
// LHL_DMA_Stop(&DMA_Handle_UartRx);//关闭DMA接收数据
// 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; // 源:缓存区
// 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)); /* 写入DMA寄存器 */
// LHL_DMA_Start(&DMA_Handle_UartTx);
// DMA_register_irq_callback(DMA_CHANNEL_UART_Tx,NULL,DMAForUART_Tx_Callback);//注册传输完成中断
//}
void ReceivedDataProcessing(void)
{
comState.state.ReceivedData = 0 ; //重置接收完成标志
Get_UART_Rx_ActualLength();//更新接收长度
MBBuf.RxdLen = comState.RxLenth; //接收数据长度
MBBuf.RxPointer = comState.RxdData; //接收数据
MBBuf.TxPointer = comState.TxdData; //发送数据
if(ModBusProtocolDetection()) //检测到Modbus协议
{
ModBusDataProcessing(); //协议处理函数 协议处理后回复数据在MBBuf.RxPointer处move到MBBuf.TxPointer也就是实际comState.TxdData存储区域
StartDMAForTxdMainUartData();//回复帧
}
else RestartDMAForRxdMainUartData();//继续重新接收(能够使通信失败时重新复位)
}
/*********************************************************************************************************************************************/
/* 带RS485的控制 */
/*********************************************************************************************************************************************/
#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