yincheng.zhong
2023-08-16 56900ed5464e7cf4215052c706e8c22b00147e4a
Ô´Âë/ºËÐİå/Src/application/serial_at_cmd_app.c
@@ -16,65 +16,65 @@
#define CMD_REPLY 3
struct pwtag_structure pwtag;
typedef enum{   UsartReceiveWaitHead0,
            UsartReceiveWaitHead1,
            UsartReceiveWaitMsgType,
            UsartReceiveWaitLength,
            UsartReceiveWaitCMD,
            UsartReceiveWaitIndex,
            UsartReceiveWaitDataLen,
            UsartReceiveWaitData,
            UsartReceiveWaitChecksum
}UsartRecvPackState;
typedef enum {   UsartReceiveWaitHead0,
                UsartReceiveWaitHead1,
                UsartReceiveWaitMsgType,
                UsartReceiveWaitLength,
                UsartReceiveWaitCMD,
                UsartReceiveWaitIndex,
                UsartReceiveWaitDataLen,
                UsartReceiveWaitData,
                UsartReceiveWaitChecksum
             } UsartRecvPackState;
uint8_t mUsartReceivePack[100] = {0};
uint8_t send_frame[200];
void SendConfigConfirm(uint8_t pack_msgtype,uint8_t pack_length)
{
   uint16_t checksum = 0;
   send_frame[0] = 0x55;
   send_frame[1] = 0xAA;
   send_frame[2] = 0x09;
   send_frame[3] = 8;
   send_frame[4] = pack_msgtype;
   send_frame[5] = pack_length;
    uint16_t checksum = 0;
    send_frame[0] = 0x55;
    send_frame[1] = 0xAA;
    send_frame[2] = 0x09;
    send_frame[3] = 8;
    send_frame[4] = pack_msgtype;
    send_frame[5] = pack_length;
   checksum = Checksum_u16(&send_frame[2],8);
   memcpy(&send_frame[10],&checksum,2);
   UART_PushFrame(send_frame, 12);
    checksum = Checksum_u16(&send_frame[2],8);
    memcpy(&send_frame[10],&checksum,2);
    UART_PushFrame(send_frame, 12);
}
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;
    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;
    send_frame[6] = state;
   checksum = Checksum_u16(&send_frame[2],14);
   memcpy(&send_frame[16],&checksum,2);
   USART_puts(send_frame, 17);
    checksum = Checksum_u16(&send_frame[2],14);
    memcpy(&send_frame[16],&checksum,2);
    USART_puts(send_frame, 17);
}
void SendComMap(uint8_t data_length, uint8_t index)
{
   uint16_t checksum = 0;
   send_frame[0] = 0x55;
   send_frame[1] = 0xAA;
   send_frame[2] = 0x03;
   send_frame[3] = data_length+5;
   send_frame[4] = CMD_REPLY;
   send_frame[5] = index;
   send_frame[6] = data_length;
   memcpy(&send_frame[7], &g_com_map[index>>1], data_length);
    uint16_t checksum = 0;
    send_frame[0] = 0x55;
    send_frame[1] = 0xAA;
    send_frame[2] = 0x03;
    send_frame[3] = data_length+5;
    send_frame[4] = CMD_REPLY;
    send_frame[5] = index;
    send_frame[6] = data_length;
    memcpy(&send_frame[7], &g_com_map[index>>1], data_length);
   checksum = Checksum_u16(&send_frame[2],5+data_length);
   memcpy(&send_frame[7+data_length],&checksum,2);
   UART_PushFrame(send_frame, data_length+9);
    checksum = Checksum_u16(&send_frame[2],5+data_length);
    memcpy(&send_frame[7+data_length],&checksum,2);
    UART_PushFrame(send_frame, data_length+9);
}
u8 remotetag_para[30],remotetag_paralen,userdatasend_flag[TAG_NUM_IN_SYS];
u8 remotesend_state=0;
@@ -84,140 +84,142 @@
struct tagpos_structure tagpos[30];
void UsartParseDataHandler(uint8_t data)
{
   static UsartRecvPackState usart_receive_state = UsartReceiveWaitHead0;
   uint16_t checksum = 0;
   static uint8_t pack_datalen = 0,pack_length = 0,pack_index = 0,pack_msgtype = 0,pack_cmd = CMD_READ;
   static uint8_t index = 0;
   uint8_t i;
    static UsartRecvPackState usart_receive_state = UsartReceiveWaitHead0;
    uint16_t checksum = 0;
    static uint8_t pack_datalen = 0,pack_length = 0,pack_index = 0,pack_msgtype = 0,pack_cmd = CMD_READ;
    static uint8_t index = 0;
    uint8_t i;
   if(usart_receive_state == UsartReceiveWaitChecksum) {         //若收到校验和包
      checksum = 0;
      for(int i = 0; i<pack_length-2; i++) {
         checksum += mUsartReceivePack[i];
      }
      checksum += pack_msgtype;
      checksum += pack_length;
rec_times1++;
      if(((data + checksum)&0xff) == 0xFF)            //校验通过
      {
         switch(pack_msgtype)
         {
            uint16_t serial_tag_id_recv;
            case MSG_RW:
                   pack_cmd = mUsartReceivePack[0];
                   pack_index = mUsartReceivePack[1];
                   pack_datalen = mUsartReceivePack[2];
               switch(pack_cmd)
               {
                  case CMD_WRITE:
                     //从mUsartReceivePack中读取pack_length长度的字节,放到全局变量中
                     memcpy((uint8_t*)&g_com_map + pack_index, &mUsartReceivePack[3], pack_datalen);
                         //   memcpy((uint8_t*)&g_com_map2 + pack_index, &mUsartReceivePack[3], 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
                            }
                     save_com_map_to_flash();
                     delay_ms(100);
                     NVIC_SystemReset();
                     break;
                  case CMD_READ:
                     //read包中data字节,即mUsartReceivePack[0]表示数据长度;
                  //从g_com_data结构体中的第index位置读取长度为mUsartReceivePack[0]的字节,发送出来
                        rec_times2++;
                     SendComMap(pack_datalen,pack_index);
                     break;
                  default:
                     break;
               }
               break;
            case MSG_WTAG:    //修改标签参数
               remotesend_state=1;
               memcpy(&configremotetagID,&mUsartReceivePack[0],2);
               //configremotetagID = pack_cmd|pack_index<<8;
               //remotetag_para[0] = mUsartReceivePack[2];
               remotetag_paralen = mUsartReceivePack[4]+3;
               memcpy(&remotetag_para[1],&mUsartReceivePack[3],remotetag_paralen);
               break;
            case MSG_PWTAG:      //批量修改标签参数
                  pwtag.groupnum = mUsartReceivePack[0];
                  pwtag.index =  mUsartReceivePack[1];
                  pwtag.remain_time = 5;
                  for(i=0;i<pwtag.groupnum;i++)
                  {
                     memcpy(pwtag.groupid[i],&mUsartReceivePack[i*6+2],4);
                     memcpy(&pwtag.group_interval[i],&mUsartReceivePack[i*6+6],2);
                  }
                     break;
            case MSG_REGTAGRESPONSE:
               regtag_map.index++;
            if(regtag_map.index==MAX_REGTAGNUM)
            {regtag_map.index = 0;}
               regtag_map.remain_time[regtag_map.index]=5;
               memcpy(&regtag_map.tagid[regtag_map.index],&mUsartReceivePack[0],2);
               memcpy(&regtag_map.tag_frequency[regtag_map.index],&mUsartReceivePack[2],2);
               memcpy(&regtag_map.tag_slotpos[regtag_map.index],&mUsartReceivePack[4],2);
               break;
             case MSG_TAGPOS:
                    memcpy(&serial_tag_id_recv,&mUsartReceivePack[0],2);
                    taglist_pos=CmpTagInList(serial_tag_id_recv);
                    tagpos[taglist_pos].tagid = serial_tag_id_recv;
                    tagpos[taglist_pos].datalen = mUsartReceivePack[2];
                    if(mUsartReceivePack[2]<=MAX_FRAME_LEN&&taglist_pos<30)
    if(usart_receive_state == UsartReceiveWaitChecksum) {         //若收到校验和包
        checksum = 0;
        for(int i = 0; i<pack_length-2; i++) {
            checksum += mUsartReceivePack[i];
        }
        checksum += pack_msgtype;
        checksum += pack_length;
        rec_times1++;
        if(((data + checksum)&0xff) == 0xFF)            //校验通过
        {
            switch(pack_msgtype)
            {
                uint16_t serial_tag_id_recv;
            case MSG_RW:
                pack_cmd = mUsartReceivePack[0];
                pack_index = mUsartReceivePack[1];
                pack_datalen = mUsartReceivePack[2];
                switch(pack_cmd)
                {
                case CMD_WRITE:
                    //从mUsartReceivePack中读取pack_length长度的字节,放到全局变量中
                    memcpy((uint8_t*)&g_com_map + pack_index, &mUsartReceivePack[3], pack_datalen);
                    //   memcpy((uint8_t*)&g_com_map2 + pack_index, &mUsartReceivePack[3], pack_datalen);
                    //返回一个error状态
                    //SendComMap(pack_datalen,pack_index);
                    if(pack_index==CNT_RESTART*2)
                    {
                        userdatasend_flag[taglist_pos] = 1;
                    memcpy(&tagpos[taglist_pos].data,&mUsartReceivePack[3],mUsartReceivePack[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
                    }
                    save_com_map_to_flash();
                    delay_ms(100);
                    NVIC_SystemReset();
                    break;
      }
         SendConfigConfirm(pack_msgtype,pack_length);
      }
      usart_receive_state = UsartReceiveWaitHead0;
      pack_index = 0;
      pack_length = 0;
      index=0;
   } else if(usart_receive_state == UsartReceiveWaitData)  {   //若果收到的是正常通讯包
      mUsartReceivePack[index] = data;
      index++;
      if(index == pack_length-2) {      //如果收到的index与长度相等
         usart_receive_state = UsartReceiveWaitChecksum;
      }
   } else if(usart_receive_state == UsartReceiveWaitLength) {                  //收到长度字节
         pack_length = data;
         pack_index = 0;
         usart_receive_state = UsartReceiveWaitData;
   } else if((usart_receive_state == UsartReceiveWaitHead0) && (data == 0x55)) {   //收到第一个包头
      usart_receive_state = UsartReceiveWaitHead1;
   } else if((usart_receive_state == UsartReceiveWaitHead1) && (data == 0xAA)) {   //收到第二个包头
      usart_receive_state = UsartReceiveWaitMsgType;
   }else if ((usart_receive_state == UsartReceiveWaitMsgType)) {
      usart_receive_state = UsartReceiveWaitLength;
      pack_msgtype = data;
   }
   else {
      usart_receive_state = UsartReceiveWaitHead0;
      pack_index = 0;
      pack_length = 0;
   }
                case CMD_READ:
                    //read包中data字节,即mUsartReceivePack[0]表示数据长度;
                    //从g_com_data结构体中的第index位置读取长度为mUsartReceivePack[0]的字节,发送出来
                    rec_times2++;
                    SendComMap(pack_datalen,pack_index);
                    break;
                default:
                    break;
                }
                break;
            case MSG_WTAG:    //修改标签参数
                remotesend_state=1;
                memcpy(&configremotetagID,&mUsartReceivePack[0],2);
                //configremotetagID = pack_cmd|pack_index<<8;
                //remotetag_para[0] = mUsartReceivePack[2];
                remotetag_paralen = mUsartReceivePack[4]+3;
                memcpy(&remotetag_para[1],&mUsartReceivePack[3],remotetag_paralen);
                break;
            case MSG_PWTAG:      //批量修改标签参数
                pwtag.groupnum = mUsartReceivePack[0];
                pwtag.index =  mUsartReceivePack[1];
                pwtag.remain_time = 5;
                for(i=0; i<pwtag.groupnum; i++)
                {
                    memcpy(pwtag.groupid[i],&mUsartReceivePack[i*6+2],4);
                    memcpy(&pwtag.group_interval[i],&mUsartReceivePack[i*6+6],2);
                }
                break;
            case MSG_REGTAGRESPONSE:
                regtag_map.index++;
                if(regtag_map.index==MAX_REGTAGNUM)
                {
                    regtag_map.index = 0;
                }
                regtag_map.remain_time[regtag_map.index]=5;
                memcpy(&regtag_map.tagid[regtag_map.index],&mUsartReceivePack[0],2);
                memcpy(&regtag_map.tag_frequency[regtag_map.index],&mUsartReceivePack[2],2);
                memcpy(&regtag_map.tag_slotpos[regtag_map.index],&mUsartReceivePack[4],2);
                break;
            case MSG_TAGPOS:
                memcpy(&serial_tag_id_recv,&mUsartReceivePack[0],2);
                taglist_pos=CmpTagInList(serial_tag_id_recv);
                tagpos[taglist_pos].tagid = serial_tag_id_recv;
                tagpos[taglist_pos].datalen = mUsartReceivePack[2];
                if(mUsartReceivePack[2]<=MAX_FRAME_LEN&&taglist_pos<30)
                {
                    userdatasend_flag[taglist_pos] = 1;
                    memcpy(&tagpos[taglist_pos].data,&mUsartReceivePack[3],mUsartReceivePack[2]);
                }
                break;
            }
            SendConfigConfirm(pack_msgtype,pack_length);
        }
        usart_receive_state = UsartReceiveWaitHead0;
        pack_index = 0;
        pack_length = 0;
        index=0;
    } else if(usart_receive_state == UsartReceiveWaitData)  {   //若果收到的是正常通讯包
        mUsartReceivePack[index] = data;
        index++;
        if(index == pack_length-2) {      //如果收到的index与长度相等
            usart_receive_state = UsartReceiveWaitChecksum;
        }
    } else if(usart_receive_state == UsartReceiveWaitLength) {                  //收到长度字节
        pack_length = data;
        pack_index = 0;
        usart_receive_state = UsartReceiveWaitData;
    } else if((usart_receive_state == UsartReceiveWaitHead0) && (data == 0x55)) {   //收到第一个包头
        usart_receive_state = UsartReceiveWaitHead1;
    } else if((usart_receive_state == UsartReceiveWaitHead1) && (data == 0xAA)) {   //收到第二个包头
        usart_receive_state = UsartReceiveWaitMsgType;
    } else if ((usart_receive_state == UsartReceiveWaitMsgType)) {
        usart_receive_state = UsartReceiveWaitLength;
        pack_msgtype = data;
    }
    else {
        usart_receive_state = UsartReceiveWaitHead0;
        pack_index = 0;
        pack_length = 0;
    }
}