Browse Source

【修正】1.uart异常重启解决,是因为返回指针移位不对,在函数外进行移位即可。2.Check部分暂时屏蔽,睡眠唤醒正常。

CHENJIE-PC\QiXiang_CHENJIE 4 years ago
parent
commit
475be3071d
1 changed files with 53 additions and 67 deletions
  1. 53 67
      src/app.c

+ 53 - 67
src/app.c

@@ -181,30 +181,8 @@ static void Main_Task(void* arg)
         {
             case PROCESS_STATE_IDLE:
             {
-                osDelay(10/portTICK_PERIOD_MS);
-                Uart_index++;
-                if (Uart_index >10)//Uart 1s 调用一次
-                {
-                    #ifdef USING_PRINTF
-                        printf("Uart_check \n");
-                    #endif
-                    PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_CHECK);
-                    Uart_index = 0;
-                }
-                if(true)//电流为0满足
-                {
-                    sleep_index++;
-                }
-                else
-                {
-                    sleep_index=0;
-                    PROC_MAIN_STATE_SWITCH(PROCESS_STATE_WORK);
-                }
-                if(sleep_index>=500)
-                {
-                    sleep_index=0;
-                    PROC_MAIN_STATE_SWITCH(PROCESS_STATE_SLEEP);
-                }
+                // 暂时不区分唤醒
+                PROC_MAIN_STATE_SWITCH(PROCESS_STATE_WORK);
                 break;
             }
             case PROCESS_STATE_WORK:
@@ -343,6 +321,14 @@ uint8_t* Uart_Receive_func(Uart_Receive_Type Uart_Receive_Msg,uint8_t* Uart_Rece
     Uart_Send_buffer[7] = CRC_chk_buffer>>8;
     uint32_t timeout = 0x00000000;
     USARTdrv->Send(Uart_Send_buffer,8);
+    #ifdef USING_PRINTF
+    printf("Uart_Send_buffer:  ");
+    for(int i=0;i<8;i++)
+    {
+        printf("%x ",Uart_Send_buffer[i]);
+    }
+     printf("\n");
+    #endif
     USARTdrv->Receive(Uart_Rece_buffer,Data_Len);
     while((isRecvTimeout == false) && (isRecvComplete == false))
     {
@@ -356,16 +342,13 @@ uint8_t* Uart_Receive_func(Uart_Receive_Type Uart_Receive_Msg,uint8_t* Uart_Rece
     }
     if (isRecvComplete == true)
     {
+        #ifdef USING_PRINTF
+        printf("isRecvComplete true\n");
+        #endif
         isRecvComplete = false;
         CRC_Rece_buffer =*(Uart_Rece_buffer+Data_Len-1)<<8|*(Uart_Rece_buffer+Data_Len-2);
         CRC_chk_buffer = crc_chk(Uart_Rece_buffer,Data_Len-2);
         #ifdef USING_PRINTF
-            printf("Uart_Send_buffer:  ");
-            for(int i=0;i<8;i++)
-            {
-            printf("%x ",Uart_Send_buffer[i]);
-            }
-            printf("\n");
             printf("Uart_Rece_buffer: ");
             for(int i=0;i<Data_Len;i++)
             {
@@ -375,12 +358,12 @@ uint8_t* Uart_Receive_func(Uart_Receive_Type Uart_Receive_Msg,uint8_t* Uart_Rece
         #endif
         if (CRC_Rece_buffer == CRC_chk_buffer)//满足校验
         {
-            return Uart_Rece_buffer+3;
+            return Uart_Rece_buffer;//此处指针移位出现重启问题
         }
         else //接收数据的校验不过屏蔽
         {
             memset(Uart_Rece_buffer,0xff,Data_Len);
-            return Uart_Rece_buffer+3;
+            return Uart_Rece_buffer;
         }
     }
     else 
@@ -415,7 +398,6 @@ static void Uart_Task(void* arg)
     Uart_Receive_Msg.Bms_Read_Funcode = 0x03;
     uint8_t *Uart_Rece_buffer = NULL;
     Batt_Cell_Num_2 = Batt_Cell_Num<<1;
-    Uart_Rece_buffer = (uint8_t *)malloc(Uart_Rece_LEN);
     while (true)
     {
         switch (gProcess_Uart_Task)
@@ -445,48 +427,52 @@ static void Uart_Task(void* arg)
             case PROCESS_UART_STATE_WORK:
             {
                 NetSocDisplay(LED_SOC_1,LED_TURN_ON);
-                switch (Rece_index)
+                bool Uart_task = false;
+                Uart_Rece_buffer = (uint8_t *)malloc(Uart_Rece_LEN);
+                while(!Uart_task)
                 {
-                    case 0:
+                    switch (Rece_index)
                     {
-                        Uart_Receive_Msg.Reg_Begin_H = 0x00;
-                        Uart_Receive_Msg.Reg_Begin_L= 0x02+Batt_Cell_Num;
-                        Uart_Receive_Msg.Reg_Num_H = 0x00;
-                        Uart_Receive_Msg.Reg_Num_L = 0x01;
-                        Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
-                        memset(Uart_Rece_buffer,0xff,Data_Len);
-                        Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
-                        Uart_Rece_BattI = *(Uart_Rece_buffer+0)<<8 |*(Uart_Rece_buffer+1);
-                        break;
-                    }
-                    case 1:
-                    {
-                        Uart_Receive_Msg.Reg_Begin_H = 0x00;
-                        Uart_Receive_Msg.Reg_Begin_L = 0x02;
-                        Uart_Receive_Msg.Reg_Num_H = Batt_Cell_Num>>8;
-                        Uart_Receive_Msg.Reg_Num_L = Batt_Cell_Num;
-                        Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
-                        memset(Uart_Rece_buffer,0xff,Data_Len);
-                        Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
-                        battbuffer[30] = Batt_Cell_Num;
-                        memcpy(&battbuffer[31],Uart_Rece_buffer,Batt_Cell_Num_2);
-                        break;
-                    }
-                    default:
-                    {
-                        PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
-                        break;
+                        case 0:
+                        {
+                            Uart_Receive_Msg.Reg_Begin_H = 0x00;
+                            Uart_Receive_Msg.Reg_Begin_L= 0x02+Batt_Cell_Num;
+                            Uart_Receive_Msg.Reg_Num_H = 0x00;
+                            Uart_Receive_Msg.Reg_Num_L = 0x01;
+                            Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
+                            memset(Uart_Rece_buffer,0xff,Data_Len);
+                            Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
+                            Uart_Rece_BattI = *(Uart_Rece_buffer+3+0)<<8 |*(Uart_Rece_buffer+3+1);
+                            break;
+                        }
+                        case 1:
+                        {
+                            Uart_Receive_Msg.Reg_Begin_H = 0x00;
+                            Uart_Receive_Msg.Reg_Begin_L = 0x02;
+                            Uart_Receive_Msg.Reg_Num_H = Batt_Cell_Num>>8;
+                            Uart_Receive_Msg.Reg_Num_L = Batt_Cell_Num;
+                            Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
+                            Uart_Rece_buffer = (uint8_t *)malloc(Data_Len);
+                            memset(Uart_Rece_buffer,0xff,Data_Len);
+                            Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
+                            battbuffer[30] = Batt_Cell_Num;
+                            memcpy(&battbuffer[31],Uart_Rece_buffer+3,Batt_Cell_Num_2);
+                            break;
+                        }
+                        default:
+                        {
+                            PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
+                            Uart_task = true;
+                            break;
+                        }
                     }
+                    Rece_index++;
                 }
-                #ifdef USING_PRINTF
-                        printf("Rece:%d\n",Rece_index);
-                #endif
-                Rece_index++;
+                free(Uart_Rece_buffer);
                 break;
             }
             case PROCESS_UART_STATE_SLEEP:
             {
-                free(Uart_Rece_buffer);
                 slpManPlatVoteEnableSleep(UartSlpHandler, SLP_SLP2_STATE);
                 while(true)
                 {