Quellcode durchsuchen

更新

添加串口接收
avery vor 6 Monaten
Ursprung
Commit
fd86ff41e6

+ 8 - 2
User/Application/Control.c

@@ -125,11 +125,17 @@ void Get_Target_Ref(void)
 {
     if (powerControl.PowerSate == POWER_RUN)
     {
-        #if (CONTROL_MODE == NONEMODE)
+        #if (CONTROL_MODE == NONE_MODE)
         isCtrlPowOn = true;
         motorControl.TargetRef = TARGET_SPEED_SET;
         motorControl.QOutRef = I_Value(2.0);
-        #elif (CONTROL_MODE == UARTMODE)
+		
+        #elif (CONTROL_MODE == UART_MODE)
+		// 接收到数据
+		if(RecMessageFalg)
+		{
+			
+		}
         #endif
     }
 }

+ 68 - 2
User/Application/Interrupt.c

@@ -94,11 +94,77 @@ void SYStick_INT(void) interrupt 10
 */
 void COM1_INT_Handler(void) interrupt 13
 {
+    static uint8_t recv_index = 0;
+    uint8_t byte = 0x00, expected_len = 0;
+    uint16_t dataLen = 0x00;
+    
     if (TI)
     { TI = 0; }
     
     if (RI)
-    { RI = 0; }
+    {
+        byte = UT_DR;
+        RI = 0;
+        #if (CONTROL_MODE == UARTMODE)
+        {
+            // 安全写入检查
+            if (recv_index >= MAX_FRAME_LEN)
+            {
+                recv_index = 0;
+                return;
+            }
+            
+            // 状态机处理
+            // 阶段1:等待帧头
+            if (recv_index == 0)
+            {
+                if (byte == FRAME_HEADER)
+                { RecvBuffer[recv_index++] = byte; }
+                
+                return;
+            }
+            
+            // 阶段2:接收功能码和长度
+            if (recv_index < DATA_OFFSET)
+            {
+                RecvBuffer[recv_index++] = byte;
+                
+                // 校验长度字段有效性
+                if (recv_index == DATA_OFFSET)
+                {
+                    dataLen = ((uint16_t)RecvBuffer[5] << 8) | RecvBuffer[4];
+                    
+                    // 检查长度字节
+                    if (dataLen > (MAX_FRAME_LEN - DATA_OFFSET - CRC_OFFSET))
+                    { recv_index = 0; }
+                }
+                
+                return;
+            }
+            
+            // 阶段3:接收数据区
+            dataLen = ((uint16_t)RecvBuffer[5] << 8) | RecvBuffer[4];
+            expected_len = DATA_OFFSET + dataLen + CRC_OFFSET;
+            
+            if (recv_index < expected_len)
+            {
+                RecvBuffer[recv_index++] = byte;
+                
+                // 完整帧接收完成
+                if (recv_index == expected_len)
+                {
+                    RecMessageFalg = true;
+                    recv_index = 0;
+                }
+                
+                return;
+            }
+            
+            // 异常情况复位
+            recv_index = 0;
+        }
+        #endif
+    }
 }
 
 /**
@@ -124,7 +190,7 @@ void DAM_INT_Handler(void) interrupt 15
 {
     if (ReadBit(DMA0_CR0, DMAIF))
     {
-        memset(&DebugDat, 0, 64);
+        memset(&DebugDat, 0, MAX_FRAME_LEN);
         ClrBit(DMA0_CR0, DMAIF);
     }
     

+ 6 - 6
User/Application/main.c

@@ -18,9 +18,9 @@ CurrentVarible     xdata   mcCurVarible;
 FOCCTRL            xdata   mcFocCtrl;
 
 /**
- * @function     HardwareInit
- * @brief        硬件初始化
- * @date         2025-11-11
+    @function     HardwareInit
+    @brief        硬件初始化
+    @date         2025-11-11
 */
 void HardwareInit(void)
 {
@@ -52,9 +52,9 @@ void HardwareInit(void)
 
 
 /**
- * @function     SoftwareInit
- * @brief        软件初始化
- * @date         2025-11-11
+    @function     SoftwareInit
+    @brief        软件初始化
+    @date         2025-11-11
 */
 void SoftwareInit(void)
 {

+ 1 - 1
User/Function/FocControl.c

@@ -98,10 +98,10 @@ void Motor_Control_State(void)
         case mcInit:
             if (motorControl.DCBus > UNDER_RECOVER_VALUE)
             {
-                // 关闭软件电流采样的ADC
                 mcFaultSource = 0;
                 memset(&mcFaultDect, 0, sizeof(FaultVarible));
                 memset(&mcFocCtrl, 0, sizeof(FOCCTRL));
+                memset(&motorControl, 0, sizeof(Motor_Control_t));
                 // PI控制器初始化
                 HW_Zero_PI_Init();
                 // 弱磁初始化

+ 5 - 4
User/Hardware/UART.c

@@ -1,8 +1,9 @@
 #include <Myproject.h>
 
 // 1 / 115200 * 640 *1000 ≈ 5.6 ms
-uint8_t xdata DebugDat[64] = {0};
-
+uint8_t xdata DebugDat[MAX_FRAME_LEN] = {0};
+uint8_t RecvBuffer[MAX_FRAME_LEN] = {0};
+bool RecMessageFalg = false;
 
 /**
     @function     UART1_Init
@@ -28,7 +29,7 @@ void UART1_Init(void)
     // 参考波特率 115200 --> 0x0C 9600 --> 0x9B
     UT_BAUD = 0x0C;
     // DMA发送配置
-    Conf_DMA(0, XDATA_UART1, DebugDat, 64);
+    Conf_DMA(0, XDATA_UART1, DebugDat, MAX_FRAME_LEN);
     ES0 = 1;
 }
 
@@ -69,7 +70,7 @@ void UART2_Init(void)
 
 /**
     @function     Dabug_Data_Update
-    @brief        调试信息上载 !高字节在前
+    @brief        调试信息上载
     @date         2025-11-05
 */
 void Dabug_Data_Update(void)

+ 1 - 1
User/include/Customer.h

@@ -119,7 +119,7 @@
 
 #define OUT_LOOP_CONTROL                (1)                                     // 外环控制使能
 #define LOOP_MODE                       (SPEED_CONTROL_MODE)                    // 外环配置
-#define CONTROL_MODE                    (NONEMODE)                              // 控制模式
+#define CONTROL_MODE                    (NONE_MODE)                              // 控制模式
 #define LOOP_CYCLE                      (1)                                     // 速度环调节周期
 #define QOUTINC                         (1)                                     // 电流环控制步进参数
 

+ 10 - 3
User/include/Definition.h

@@ -74,8 +74,8 @@
 #define Open_Omega_Start                (0xC0)
 
 //调速模式
-#define UARTMODE                        (0xA0)
-#define NONEMODE                        (0xB0)
+#define UART_MODE                       (0xA0)
+#define NONE_MODE                       (0xB0)
 
 // 外环
 #define POWER_CONTROL_MODE              (0xA0)
@@ -236,6 +236,11 @@
 #define MAIN_RELAY                      GP51                        // 母线主继电器
 
 
+// 串口通讯协议定义 << 匿名协议
+#define FRAME_HEADER                    0xAB                        // 帧头
+#define MAX_FRAME_LEN                   0x40                        // 最大数据帧长度
+#define DATA_OFFSET                     0x06                        // 头(1B) + 地址(2B) + 功能码(1B) + 长度(2B)
+#define CRC_OFFSET                      0x02                        // 校验字(2B)
 
 // ------------------------------------------------------------------------------------------------------------------
 // 4.结构体定义与声明 函数声明
@@ -374,7 +379,9 @@ void Sys_Tick(void);
 void UART1_Init(void);
 void UART2_Init(void);
 
-extern uint8_t xdata DebugDat[64];
+extern bool RecMessageFalg;
+extern uint8_t xdata DebugDat[MAX_FRAME_LEN];
+extern uint8_t RecvBuffer[MAX_FRAME_LEN];
 void Dabug_Data_Update(void);