From 04b95840e106182266f71a549b85bcfff083deb1 Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期五, 23 五月 2025 18:07:48 +0800 Subject: [PATCH] 成功测试完毕新的蓝牙和MK的传输协议,并实现读写功能 --- keil/include/drivers/serial_at_cmd_app.c | 73 +++++++++++++++++++++++------------- 1 files changed, 46 insertions(+), 27 deletions(-) diff --git a/keil/include/drivers/serial_at_cmd_app.c b/keil/include/drivers/serial_at_cmd_app.c index aa7ce9b..236c51b 100644 --- a/keil/include/drivers/serial_at_cmd_app.c +++ b/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; } -- Gitblit v1.9.3