zhyinch
2021-08-25 6e7d484264afa951a0491cb4a868580a2f0b647b
Ô´Âë/ºËÐİå/Src/application/serial_at_cmd_app.c
@@ -9,7 +9,7 @@
#define CMD_READ   1
#define CMD_WRITE   2
#define CMD_REPLY 3
#define EUART_RX_BUF_SIZE 100
#define EUART_RX_BUF_SIZE 200
typedef enum{   UsartReceiveWaitHead0, 
            UsartReceiveWaitHead1,
            UsartReceiveWaitMsgType,
@@ -18,13 +18,14 @@
            UsartReceiveWaitIndex,
            UsartReceiveWaitDataLen,
            UsartReceiveWaitData,
            UsartReceiveWaitChecksum
            UsartReceiveWaitChecksum0,
            UsartReceiveWaitChecksum1
}UsartRecvPackState;
uint8_t mUsartReceivePack[100] = {0};
uint8_t send_frame[200];
void SendComMap(uint8_t data_length, uint8_t index)
{
   static uint8_t send_frame[EUART_RX_BUF_SIZE];
   uint16_t checksum = 0;
   send_frame[0] = 0x55;
   send_frame[1] = 0xAA;
@@ -43,7 +44,23 @@
   
   UART_PushFrame(send_frame, data_length+9);   
}
void SendAnchorState(uint16_t state)
{
   uint16_t checksum = 0;
   send_frame[0] = 0x55;
   send_frame[1] = 0xAA;
   send_frame[2] = 0x10;
   send_frame[3] = 14;
    memcpy(&send_frame[4],&dev_id,2);
   send_frame[6] = state;
   checksum = Checksum_u16(&send_frame[2],14);
   memcpy(&send_frame[16],&checksum,2);
   USART_puts(send_frame, 17);
}
u16 rec_checksum;
void UsartParseDataHandler(uint8_t data)
{
   static UsartRecvPackState usart_receive_state = UsartReceiveWaitHead0;
@@ -53,7 +70,7 @@
   
   if(usart_receive_state == UsartReceiveWaitChecksum) {         //若收到校验和包
   if(usart_receive_state == UsartReceiveWaitChecksum1) {         //若收到校验和包
      checksum = 0;
      for(int i = 0; i<pack_length-5; i++) { 
         checksum += mUsartReceivePack[i];
@@ -63,8 +80,10 @@
      checksum += pack_index;
      checksum += pack_datalen;
      checksum += pack_msgtype;
      checksum = ~checksum;
      cmd_mode = 0;
      if((data + checksum)&0xff == 0xFF)            //校验通过
      rec_checksum = rec_checksum|(data<<8);
      if((rec_checksum) == (checksum))            //校验通过
      {
         switch(pack_cmd)
         {
@@ -73,6 +92,29 @@
               memcpy((uint8_t*)&g_com_map + pack_index, mUsartReceivePack, pack_datalen);
               //返回一个error状态
               //SendComMap(pack_datalen,pack_index);
                    if(pack_index==CNT_RESTART*2)
                            {
                                SendAnchorState(SM_RESTART);
                                SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader
                            }
                            if(pack_index==CNT_UPDATE*2)
                            {
                                uint32_t result = 0;
                                u16 tmp = 0xAAAA;
                                SendAnchorState(SM_UPDATE);
                                __disable_irq();
                                result = FLASH_Prepare(0x8004A38, 2);
                                if(result)
                                    result = FLASH_Write(0x8004A38, (const uint8_t*)&tmp, 2);
                                __enable_irq();
                                printf("进入升级模式\r\n");
                               //delay_ms(100);
                                SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader
                            }
                            if(pack_index==CNT_REBOOT*2)
                            {
                                returnfactory_parameter();
                            }
               save_com_map_to_flash();
               delay_ms(100);
               NVIC_SystemReset();
@@ -90,11 +132,14 @@
      pack_index = 0;
      pack_length = 0;
      index=0;
   } else if((usart_receive_state == UsartReceiveWaitData) ) {   //若果收到的是正常通讯包
   }  else if((usart_receive_state == UsartReceiveWaitChecksum0) ) {
         rec_checksum = data;
      usart_receive_state = UsartReceiveWaitChecksum1;
   }else if((usart_receive_state == UsartReceiveWaitData) ) {   //若果收到的是正常通讯包
      mUsartReceivePack[index] = data;
      index++;
      if(index == pack_length-5) {      //如果收到的index与长度相等
         usart_receive_state = UsartReceiveWaitChecksum;
         usart_receive_state = UsartReceiveWaitChecksum0;
      }
   } else if(usart_receive_state == UsartReceiveWaitDataLen) {                  //收到指令类型字节
      pack_datalen = data;