zhangbo
2025-02-28 e8fae59212dd962e2f13137f53d70bd1625891fb
keil/include/drivers/serial_at_cmd_app.c
@@ -139,128 +139,57 @@
#define buff_lenth 1024
#define MAX_BASE_STATIONS 10
uint8_t DMA_RXBuf_BT[200]={0};
uint8_t Forward_BT_buff[buff_lenth]={0};
uint8_t report_ancnum_bt=0;
uint8_t data_length_flag=0;
void UsartParseDataHandler(uint8_t data)
{
     uint8_t buff[buff_lenth] = {0};
    uint8_t length = 0;
    uint8_t base_station_count = 0;
      memcpy(buff, m_EUART_DMA_RXBuf, 1024);
    //memcpy(buff, Forward_BT_buff, 1024);
    // 遍历
    for (int n = 0; n < 1024 - 6; n++)
    {
        // 包头 0x55 0xAA 0x41
        if (buff[n] == 0x55 && buff[n+1] == 0xAA && buff[n+2] == 0x41)
        {
                  report_ancnum_bt=buff[n+4];
            length = buff[n+3];
            if (n + 6 + report_ancnum_bt * 6 + length > 1024) {
                continue; // 如果数据越界,跳过该包
        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,pack_num=0;
        static uint8_t index = 0;
        if(usart_receive_state == UsartReceiveWaitChecksum)
        {   //若收到校验和包
                 if(mUsartReceivePack[pack_datalen-1]==0x66&&data==0xBB)
                  {
                   memcpy(&DMA_RXBuf_BT[0],&mUsartReceivePack[0], pack_datalen-1);
                  }
            usart_receive_state = UsartReceiveWaitHead0;
            pack_index = 0;
            pack_length = 0;
            index=0;
        } else if((usart_receive_state == UsartReceiveWaitData) ) {   //若果收到的是正常通讯包
            mUsartReceivePack[pack_index] = data;
            pack_index++;
//                 if(data_length_flag==1)
//                  {
//                     data_length_flag=0;
//                     usart_receive_state = UsartReceiveWaitDataLen;
////                     pack_length=0x03+data;
//                  }
            if(pack_index == pack_datalen) {      //如果收到的index与长度相等
                usart_receive_state = UsartReceiveWaitChecksum;
            }
            // 将数据复制到 DMA 缓冲区
            memcpy(DMA_RXBuf_BT, &buff[n+4], length);
        } else if(usart_receive_state == UsartReceiveWaitDataLen) {                  //收到指令类型字节
            pack_datalen = 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) && (data == 0x41)) {
            usart_receive_state = UsartReceiveWaitDataLen;
            // 为了避免多次重复解析同一个数据包,可以在这里添加跳跃
            n += 6 + report_ancnum_bt * 6 + length - 1; // 跳过当前数据包
        }
    }
    // 清除临时缓冲区
    memset(buff, 0, buff_lenth);
//    if(state5V_prase_flag&&!g_com_map[MODBUS_MODE])
//    {   //升级程序
//        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;
//        if(usart_receive_state == UsartReceiveWaitChecksum)
//        {   //若收到校验和包
//            checksum = 0;
//            for(int i = 0; i<pack_length-5; i++) {
//                checksum += mUsartReceivePack[i];
//            }
//            checksum += pack_cmd;
//            checksum += pack_length;
//            checksum += pack_index;
//            checksum += pack_datalen;
//            checksum += pack_msgtype;
//            if(((data + checksum)&0xff) == 0xFF)            //校验通过
//            {
//                switch(pack_cmd)
//                {
//                case CMD_WRITE:
//                  if(pack_index==MODBUS_MODE*2)
//                  {
//                      Uart1GpsRecDebugSend();
//                      g_com_map[MODBUS_MODE] = 1;
//                      return;
//                  }
//                    //从mUsartReceivePack中读取pack_length长度的字节,放到全局变量中,赋值保存的参数并且存入flash
//                    memcpy((uint8_t*)&g_com_map + pack_index, mUsartReceivePack, pack_datalen);
//                    if(mUsartReceivePack[0]==1)
//                        UpdateProcess(pack_index);
//                    //返回一个error状态
//                    //SendComMap(pack_datalen,pack_index);
//                    save_com_map_to_flash();
//                    //delay_ms(100);
//                    NVIC_SystemReset();
//                    break;
//                case CMD_READ:
//                    //read包中data字节,即mUsartReceivePack[0]表示数据长度;
//                    //从g_com_data结构体中的第index位置读取长度为mUsartReceivePack[0]的字节,发送出来
//                    SendComMap(pack_datalen,pack_index>>1);
//                    break;
//                default:
//                    break;
//                }
//            }
//            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-5) {      //如果收到的index与长度相等
//                usart_receive_state = UsartReceiveWaitChecksum;
//            }
//        } else if(usart_receive_state == UsartReceiveWaitDataLen) {                  //收到指令类型字节
//            pack_datalen = data;
//            usart_receive_state = UsartReceiveWaitData;
//        } else if(usart_receive_state == UsartReceiveWaitIndex) {                  //收到指令类型字节
//            pack_index = data;
//            usart_receive_state = UsartReceiveWaitDataLen;
//        } else if(usart_receive_state == UsartReceiveWaitCMD) {                     //收到指令类型字节
//            pack_cmd = data;
//            usart_receive_state = UsartReceiveWaitIndex;
//        } else if(usart_receive_state == UsartReceiveWaitLength) {                  //收到长度字节
//            pack_length = data;
//            pack_index = 0;
//            usart_receive_state = UsartReceiveWaitCMD;
//        } 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) && (data == 0x3)) {
//            usart_receive_state = UsartReceiveWaitLength;
//            pack_msgtype = data;
//        }
//        else {
//            usart_receive_state = UsartReceiveWaitHead0;
//            pack_index = 0;
//            pack_length = 0;
//        }
        else {
            usart_receive_state = UsartReceiveWaitHead0;
            pack_index = 0;
            pack_length = 0;
        }
//    } else if(gps_prase_flag)
//    {
//        static uint8_t index = 0;