chen
2025-05-23 04b95840e106182266f71a549b85bcfff083deb1
keil/include/drivers/serial_at_cmd_app.c
@@ -239,12 +239,12 @@
   send_frame[4] = data_length+6;
   send_frame[5] = index;
   memcpy(&send_frame[6], &g_com_map[index], data_length);
   checksum = Checksum_u16(&send_frame[2],5+data_length);
   checksum = Checksum_u16(&send_frame[2],4+data_length);
   memcpy(&send_frame[6+data_length],&checksum,2);
   
    uart_send(UART_ID0, send_frame,data_length+8, NULL);   
}
void Send_Commap_mk_to_ble(uint8_t data_length, uint8_t index)
void mk_write_to_ble(uint8_t data_length, uint8_t index)
{
static uint8_t send_frame[100];
   uint16_t checksum = 0;
@@ -255,7 +255,7 @@
   send_frame[4] = data_length+6;
   send_frame[5] = index;
   memcpy(&send_frame[6], &g_com_map[index], data_length);
   checksum = Checksum_u16(&send_frame[2],5+data_length);
   checksum = Checksum_u16(&send_frame[2],4+data_length);
   memcpy(&send_frame[6+data_length],&checksum,2);
   
    uart_send(UART_ID0, send_frame,data_length+8, NULL);   
@@ -269,11 +269,12 @@
   send_frame[1] = 0xAA;
   send_frame[2] = 0x40;
   send_frame[3] = CMD_READ;
   send_frame[4] = data_length;
   send_frame[4] = data_length+6;
   send_frame[5] = index;
   checksum = Checksum_u16(&send_frame[2],5+data_length);
    uart_send(UART_ID0, send_frame,6, NULL);
   checksum = Checksum_u16(&send_frame[2],4);
    uart_send(UART_ID0, send_frame,8, NULL);
}
uint16_t pack_checksum_test=0,test_calculate = 0;
void Usart0ParseDataHandler(uint8_t data)//UART蓝牙数据分析处理
{
      // 全局变量
@@ -310,7 +311,7 @@
            break;
            
        case Usart0ReceiveWaitCmdType:
            if(data == 0x40) {
            if(data == 64) {
                pack_cmd_type = data;
                usart0_receive_state = Usart0ReceiveWaitMsgType;
                send_frame[frame_index++] = data;
@@ -320,7 +321,7 @@
            break;
            
        case Usart0ReceiveWaitMsgType:
            if(data == 0x2) {  // 写消息类型
            if(data == 0x2||data==0x1||data==0x3) {  // 读写回复消息类型
                pack_msg_type = data;
                usart0_receive_state = Usart0ReceiveWaitDataLen;
                send_frame[frame_index++] = data;
@@ -338,35 +339,53 @@
            
        case Usart0ReceiveWaitParamAddr:
            pack_param_addr = data;
            usart0_receive_state = Usart0ReceiveWaitData;
                  if(pack_msg_type==CMD_READ)
                  {
                     usart0_receive_state = Usart0ReceiveWaitChecksum1;
                     pack_datalen=pack_data_len-6;
                  }else{
                     usart0_receive_state = Usart0ReceiveWaitData;
                  }
            send_frame[frame_index++] = data;
            break;
            
        case Usart0ReceiveWaitData:
            mUsart2ReceivePack[index++] = data;
            send_frame[frame_index++] = data;
            if(index == pack_data_len-6) {
                usart0_receive_state = Usart0ReceiveWaitChecksum;
                     send_frame[frame_index++] = data;
                  mUsart2ReceivePack[index++] = data;
                     if(index == pack_data_len-6) {
                usart0_receive_state = Usart0ReceiveWaitChecksum1;
                        pack_datalen=pack_data_len-6;
            }
              }
            break;
            
        case Usart0ReceiveWaitChecksum:
        case Usart0ReceiveWaitChecksum1:
            pack_checksum = data << 8;  // 高字节
                  pack_checksum_test = data << 8;  // 高字节
                  send_frame[frame_index++] = data;
               usart0_receive_state = Usart0ReceiveWaitChecksum2;
                  break;
            case Usart0ReceiveWaitChecksum2:
            pack_checksum |= data;  // 低字节
            // 计算校验和 (从第3个字节开始,长度为5+数据长度)
            calculated_checksum = Checksum_u16(&send_frame[2],pack_datalen+5);
            pack_checksum_test |= data;  // 低字节
            // 计算校验和 (从第3个字节开始,长度为4+数据长度)
                  if(pack_msg_type!=CMD_READ)
            {
                  calculated_checksum = Checksum_u16(&send_frame[2],pack_datalen+4);
                  }else{
                  calculated_checksum = Checksum_u16(&send_frame[2],4);
                  }
            test_calculate=calculated_checksum;
            // 验证校验和
            if(pack_checksum == calculated_checksum) {
                // 校验通过,处理数据
                           switch(pack_cmd_type)
                           {
                           switch(pack_msg_type)
                              {
                              case CMD_REPLY:
                              case CMD_WRITE:
                                 //从mUsartReceivePack中读取pack_length长度的字节,放到全局变量中,赋值保存的参数并且存入flash
                              
                                 memcpy((uint8_t*)&g_com_map + pack_param_addr, mUsart2ReceivePack, pack_datalen);
                                 memcpy((uint8_t*)&g_com_map + pack_param_addr*2, mUsart2ReceivePack, pack_datalen);
                              
                                 //返回一个error状态
                                 //SendComMap(pack_datalen,pack_index);
@@ -375,13 +394,13 @@
//                                 NVIC_SystemReset();
                                 break;
                              case CMD_READ:
                                       Send_Commap_mk_to_ble(pack_datalen,pack_param_addr);
                                       uart0_send_ComMap_to_BLE(pack_datalen,pack_param_addr);
                                 
                                 break;
                              case CMD_REPLY:
                                 memcpy((uint8_t*)&g_com_map + pack_param_addr, mUsart2ReceivePack, pack_datalen);
                                 save_com_map_to_flash();
                                 break;
//                              case CMD_REPLY:
//                                 memcpy((uint8_t*)&g_com_map + pack_param_addr, mUsart2ReceivePack, pack_datalen);
//                                 save_com_map_to_flash();
//                                 break;
                              default:
                                 break;
                           }