Browse Source

【修改】uart读取数据实验过了,修改了内存申请方式,睡眠唤醒正常

CHENJIE-PC\QiXiang_CHENJIE 4 years ago
parent
commit
67488cb10a
1 changed files with 78 additions and 10 deletions
  1. 78 10
      src/app.c

+ 78 - 10
src/app.c

@@ -343,7 +343,6 @@ 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);
@@ -354,7 +353,7 @@ uint8_t* Uart_Receive_func(Uart_Receive_Type Uart_Receive_Msg,uint8_t* Uart_Rece
             {
             printf("%x ",*(Uart_Rece_buffer+i));
             }
-            printf("crcchk:%x,%x  ",CRC_chk_buffer,CRC_Rece_buffer);
+            printf("crcchk:%x,%x\n ",CRC_chk_buffer,CRC_Rece_buffer);
         #endif
         if (CRC_Rece_buffer == CRC_chk_buffer)//满足校验
         {
@@ -387,8 +386,7 @@ static void Uart_Task(void* arg)
                       ARM_USART_STOP_BITS_1 |
                       ARM_USART_FLOW_CONTROL_NONE, 9600);
     int Rece_index = 0;
-    uint8_t Data_Len;
-    uint8_t *Uart_Reve_Point = NULL;
+    volatile  uint8_t Data_Len;
     Uart_Receive_Type Uart_Receive_Msg;
     memset(&battbuffer[0],0x00,100);
 	PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
@@ -410,6 +408,7 @@ static void Uart_Task(void* arg)
             }
             case PROCESS_UART_STATE_CHECK:
             {
+                Uart_Rece_buffer = (uint8_t *)malloc(Uart_Rece_LEN);
                 Uart_Receive_Msg.Reg_Begin_H = 0x00;
                 Uart_Receive_Msg.Reg_Begin_L= 0x02+Batt_Cell_Num;
                 Uart_Receive_Msg.Reg_Num_H = 0x00;
@@ -417,11 +416,12 @@ static void Uart_Task(void* arg)
                 Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
                 memset(Uart_Rece_buffer,0x00,Data_Len);
                 Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
-                Uart_Rece_BattI = *(Uart_Reve_Point+0)<<8 |*(Uart_Reve_Point+1);
+                Uart_Rece_BattI = *(Uart_Rece_buffer+3+0)<<8 |*(Uart_Rece_buffer+3+1);
                 #ifdef USING_PRINTF
                         printf("Check_Current!\n");
                 #endif
                 PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
+                free(Uart_Rece_buffer);
                 break;
             }
             case PROCESS_UART_STATE_WORK:
@@ -433,32 +433,100 @@ static void Uart_Task(void* arg)
                 {
                     switch (Rece_index)
                     {
-                        case 0:
+                        case 0://current
                         {
                             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);
+                            memset(Uart_Rece_buffer,0x00,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:
+                        case 1://cell votage
                         {
                             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);
+                            memset(Uart_Rece_buffer,0x00,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;
                         }
+                        case 2://temprature
+                        {
+                            Uart_Receive_Msg.Reg_Begin_H = 0x00;
+                            Uart_Receive_Msg.Reg_Begin_L = 0x06+Batt_Cell_Num;
+                            Uart_Receive_Msg.Reg_Num_H = Batt_Temp_Num>>8;
+                            Uart_Receive_Msg.Reg_Num_L = Batt_Temp_Num;
+                            Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
+                            memset(Uart_Rece_buffer,0x00,Data_Len);
+                            Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
+                            battbuffer[31+Batt_Cell_Num_2] = Batt_Temp_Num;
+                            for (int i = 0; i < Batt_Temp_Num; i++)
+                            {
+                                battbuffer[32+Batt_Cell_Num_2+i] = *(Uart_Rece_buffer+3+2*i+1);
+                            }
+                            break;
+                        }
+                        case 3://batt votage
+                        {
+                            Uart_Receive_Msg.Reg_Begin_H = 0x00;
+                            Uart_Receive_Msg.Reg_Begin_L = 0x18+Batt_Cell_Num+Batt_Temp_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,0x00,Data_Len);
+                            Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
+                            battbuffer[19] = *(Uart_Rece_buffer+3+0);//Link U
+                            battbuffer[20] = *(Uart_Rece_buffer+3+1);
+                            battbuffer[21] = *(Uart_Rece_buffer+3+0);//Pack U
+                            battbuffer[22] = *(Uart_Rece_buffer+3+1);
+                            break;
+                        }
+                        case 4://soc,soh
+                        {
+                            Uart_Receive_Msg.Reg_Begin_H = 0x00;
+                            Uart_Receive_Msg.Reg_Begin_L = 0x09+Batt_Cell_Num+Batt_Temp_Num;
+                            Uart_Receive_Msg.Reg_Num_H = 0x00;
+                            Uart_Receive_Msg.Reg_Num_L = 0x04;
+                            Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
+                            memset(Uart_Rece_buffer,0x00,Data_Len);
+                            Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
+                            battbuffer[23] = *(Uart_Rece_buffer+3+0)>>1;//mos状态
+                            battbuffer[24] = *(Uart_Rece_buffer+3+5);//SOC
+                            battbuffer[25] = *(Uart_Rece_buffer+3+7);//SOH
+                            break;
+                        }
+                        case 5://均衡
+                        {
+                            Uart_Receive_Msg.Reg_Begin_H = 0x00;
+                            Uart_Receive_Msg.Reg_Begin_L = 0x06+Batt_Cell_Num+Batt_Temp_Num;
+                            Uart_Receive_Msg.Reg_Num_H = 0x00;
+                            Uart_Receive_Msg.Reg_Num_L = 0x02;
+                            Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
+                            memset(Uart_Rece_buffer,0x00,Data_Len);
+                            Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
+                            memcpy(&battbuffer[26],Uart_Rece_buffer+3,4);
+                            break;
+                        }
+                        case 6:
+                        {
+                            Uart_Receive_Msg.Reg_Begin_H = 0x00;
+                            Uart_Receive_Msg.Reg_Begin_L = 0x19+Batt_Cell_Num+Batt_Temp_Num;
+                            Uart_Receive_Msg.Reg_Num_H = 0x00;
+                            Uart_Receive_Msg.Reg_Num_L = 0x02;
+                            Data_Len = Uart_Receive_Msg.Reg_Num_L*2+5;
+                            memset(Uart_Rece_buffer,0x00,Data_Len);
+                            Uart_Rece_buffer = Uart_Receive_func(Uart_Receive_Msg,Uart_Rece_buffer,Data_Len);
+                            memcpy(&battbuffer[34+Batt_Cell_Num_2+Batt_Temp_Num],Uart_Rece_buffer+3,4);
+                            break; 
+                        }
                         default:
                         {
                             PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);