chen
2025-05-23 04b95840e106182266f71a549b85bcfff083deb1
成功测试完毕新的蓝牙和MK的传输协议,并实现读写功能
已修改3个文件
78 ■■■■■ 文件已修改
keil/include/drivers/serial_at_cmd_app.c 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keil/include/drivers/serial_at_cmd_app.h 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keil/include/main/main.c 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
                                    }
keil/include/drivers/serial_at_cmd_app.h
@@ -30,7 +30,8 @@
    Usart0ReceiveWaitDataLen,
    Usart0ReceiveWaitParamAddr,
    Usart0ReceiveWaitData,
    Usart0ReceiveWaitChecksum,
    Usart0ReceiveWaitChecksum1,
        Usart0ReceiveWaitChecksum2,
} Usart0ReceiveState;
extern uint8_t mUsartReceivePack[100];
keil/include/main/main.c
@@ -355,8 +355,6 @@
    LOG_INFO(TRACE_MODULE_APP, "UCI FiRa example\r\n");
    if(gpio_pin_get_val(MODE_CHANGE_PIN))
    {
        // Platform init for WSF
    PalSysInit();