From b13574876322e59f75f26ac38f72c6b19c9d4aba Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期五, 27 六月 2025 14:02:08 +0800 Subject: [PATCH] 刚解决完网关下发会导致异常问题,但蓝牙那边mk给蓝牙发未配置成功未解决,开始调lora功耗 --- keil/include/main/main.c | 14 +- keil/include/src/Radio/lora_1268.c | 28 ++-- keil/include/drivers/serial_at_cmd_app.c | 284 +++++++++++++++++++++++----------------------- 3 files changed, 166 insertions(+), 160 deletions(-) diff --git a/keil/include/drivers/serial_at_cmd_app.c b/keil/include/drivers/serial_at_cmd_app.c index d1ad26a..4813082 100644 --- a/keil/include/drivers/serial_at_cmd_app.c +++ b/keil/include/drivers/serial_at_cmd_app.c @@ -521,159 +521,161 @@ memcpy(&send_frame[8],&set_mk_time,2); checksum=Checksum_u16(&send_frame[2],8); memcpy(&send_frame[10],&checksum,2); + //LOG_INFO(TRACE_MODULE_APP,"发给ble的checksum %#x\r\n",checksum); uart_send(UART_ID0, send_frame,12, NULL); + uart_send(UART_ID1, send_frame,12, NULL); } extern uint8_t bat_percent; extern uint32_t dev_id; void Usart0ParseDataHandler(uint8_t data)//UART蓝牙数据分析处理 { -// // 全局变量 -//static Usart0ReceiveState usart0_receive_state = Usart0ReceiveWaitHead0; + // 全局变量 +static Usart0ReceiveState usart0_receive_state = Usart0ReceiveWaitHead0; -//static uint8_t index = 0; // 缓冲区索引 -//static uint8_t pack_cmd_type = 0; // 指令类型 -//static uint8_t pack_msg_type = 0; // 消息类型 -//static uint8_t pack_data_len = 0; // 数据长度 -//static uint8_t pack_param_addr = 0; // 参数地址 -//static uint16_t pack_checksum = 0; // 接收到的校验和 -//static uint16_t calculated_checksum = 0; // 计算得到的校验和 -//static uint8_t send_frame[256]; // 用于计算校验和的帧 -//static uint8_t frame_index = 0; // 帧缓冲区索引 -//static uint8_t pack_datalen = 0; -// -// LOG_INFO(TRACE_MODULE_APP,"收到 %#x\r\n",data); -// switch(usart0_receive_state) { -// case Usart0ReceiveWaitHead0: -// if(data == 0x55) { -// usart0_receive_state = Usart0ReceiveWaitHead1; -// // 初始化帧缓冲区 -// frame_index = 0; -// send_frame[frame_index++] = data; -// } -// break; -// -// case Usart0ReceiveWaitHead1: -// if(data == 0xAA) { -// usart0_receive_state = Usart0ReceiveWaitCmdType; -// send_frame[frame_index++] = data; -// } else { -// usart0_receive_state = Usart0ReceiveWaitHead0; -// } -// break; -// -// case Usart0ReceiveWaitCmdType: -// if(data == 64) { -// pack_cmd_type = data; -// usart0_receive_state = Usart0ReceiveWaitMsgType; -// send_frame[frame_index++] = data; -// } else { -// usart0_receive_state = Usart0ReceiveWaitHead0; -// } -// break; -// -// case Usart0ReceiveWaitMsgType: -// if(data == 0x2||data==0x1) { // 读写回复消息类型 -// pack_msg_type = data; -// usart0_receive_state = Usart0ReceiveWaitDataLen; -// send_frame[frame_index++] = data; -// } else { -// usart0_receive_state = Usart0ReceiveWaitHead0; -// } -// break; -// -// case Usart0ReceiveWaitDataLen: -// pack_data_len = data; -// index = 0; -// usart0_receive_state = Usart0ReceiveWaitData; +static uint8_t index = 0; // 缓冲区索引 +static uint8_t pack_cmd_type = 0; // 指令类型 +static uint8_t pack_msg_type = 0; // 消息类型 +static uint8_t pack_data_len = 0; // 数据长度 +static uint8_t pack_param_addr = 0; // 参数地址 +static uint16_t pack_checksum = 0; // 接收到的校验和 +static uint16_t calculated_checksum = 0; // 计算得到的校验和 +static uint8_t send_frame[256]; // 用于计算校验和的帧 +static uint8_t frame_index = 0; // 帧缓冲区索引 +static uint8_t pack_datalen = 0; + + LOG_INFO(TRACE_MODULE_APP,"收到 %#x\r\n",data); + switch(usart0_receive_state) { + case Usart0ReceiveWaitHead0: + if(data == 0x55) { + usart0_receive_state = Usart0ReceiveWaitHead1; + // 初始化帧缓冲区 + frame_index = 0; + send_frame[frame_index++] = data; + } + break; + + case Usart0ReceiveWaitHead1: + if(data == 0xAA) { + usart0_receive_state = Usart0ReceiveWaitCmdType; + send_frame[frame_index++] = data; + } else { + usart0_receive_state = Usart0ReceiveWaitHead0; + } + break; + + case Usart0ReceiveWaitCmdType: + if(data == 64) { + pack_cmd_type = data; + usart0_receive_state = Usart0ReceiveWaitMsgType; + send_frame[frame_index++] = data; + } else { + usart0_receive_state = Usart0ReceiveWaitHead0; + } + break; + + case Usart0ReceiveWaitMsgType: + if(data == 0x2||data==0x1) { // 读写回复消息类型 + pack_msg_type = data; + usart0_receive_state = Usart0ReceiveWaitDataLen; + send_frame[frame_index++] = data; + } else { + usart0_receive_state = Usart0ReceiveWaitHead0; + } + break; + + case Usart0ReceiveWaitDataLen: + pack_data_len = data; + index = 0; + usart0_receive_state = Usart0ReceiveWaitData; + send_frame[frame_index++] = data; + break; + +// case Usart0ReceiveWaitParamAddr: +// pack_param_addr = data; +// 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 Usart0ReceiveWaitParamAddr: -//// pack_param_addr = data; -//// 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: -// send_frame[frame_index++] = data; -// mUsart2ReceivePack[index++] = data; -// -// if(index == pack_data_len-3) { -// usart0_receive_state = Usart0ReceiveWaitChecksum1; -// //pack_datalen=pack_data_len; -// } -// break; -// -// case Usart0ReceiveWaitChecksum1: -// pack_checksum = data; // 高字节 -// pack_checksum_test = data; // 高字节 -// send_frame[frame_index++] = data; -// usart0_receive_state = Usart0ReceiveWaitChecksum2; -// LOG_INFO(TRACE_MODULE_APP,"收到校验1 %#x\r\n",data); -// break; -// case Usart0ReceiveWaitChecksum2: -// pack_checksum |= data<<8; // 低字节 -// pack_checksum_test |= data<<8; // 低字节 -// LOG_INFO(TRACE_MODULE_APP,"收到校验2 %#x\r\n",data); -// // 计算校验和 (从第3个字节开始,长度为4+数据长度) -//// if(pack_msg_type!=CMD_REPLY) -//// { -// calculated_checksum = Checksum_u16(&send_frame[2],pack_data_len); -//// }else{ -//// //calculated_checksum = Checksum_u16(&send_frame[2],4); -//// -//// } -// test_calculate=calculated_checksum; -// LOG_INFO(TRACE_MODULE_APP,"收到校验 %#x,%#x\r\n",calculated_checksum,pack_checksum); -// // 验证校验和 -// if(pack_checksum == calculated_checksum) { -// // 校验通过,处理数据 -// switch(pack_msg_type) -// { -// case CMD_BLE_TO_MK: -// memcpy(&dev_id,&mUsart2ReceivePack[0],2); -// bat_percent=mUsart2ReceivePack[2]; -// memcpy(&set_mk_time,&mUsart2ReceivePack[3],2); -// memcpy(&g_com_map[DEV_ID],&dev_id,2); -// memcpy(&g_com_map[SET_START_TIME],&set_mk_time,2); -// Send_Reply_To_Ble(); -// LOG_INFO(TRACE_MODULE_APP,"收到蓝牙数据 set_mk_time %d,dev_id %04x,bat_percent %d\r\n",set_mk_time,dev_id,bat_percent); -// save_com_map_to_flash(); -// //memcpy((uint8_t*)&g_com_map + pack_param_addr*2, mUsart2ReceivePack, pack_datalen); -// + + case Usart0ReceiveWaitData: + send_frame[frame_index++] = data; + mUsart2ReceivePack[index++] = data; + + if(index == pack_data_len-3) { + usart0_receive_state = Usart0ReceiveWaitChecksum1; + //pack_datalen=pack_data_len; + } + break; + + case Usart0ReceiveWaitChecksum1: + pack_checksum = data; // 高字节 + pack_checksum_test = data; // 高字节 + send_frame[frame_index++] = data; + usart0_receive_state = Usart0ReceiveWaitChecksum2; + LOG_INFO(TRACE_MODULE_APP,"收到校验1 %#x\r\n",data); + break; + case Usart0ReceiveWaitChecksum2: + pack_checksum |= data<<8; // 低字节 + pack_checksum_test |= data<<8; // 低字节 + LOG_INFO(TRACE_MODULE_APP,"收到校验2 %#x\r\n",data); + // 计算校验和 (从第3个字节开始,长度为4+数据长度) +// if(pack_msg_type!=CMD_REPLY) +// { + calculated_checksum = Checksum_u16(&send_frame[2],pack_data_len); +// }else{ +// //calculated_checksum = Checksum_u16(&send_frame[2],4); +// +// } + test_calculate=calculated_checksum; + LOG_INFO(TRACE_MODULE_APP,"收到校验 %#x,%#x\r\n",calculated_checksum,pack_checksum); + // 验证校验和 + if(pack_checksum == calculated_checksum) { + // 校验通过,处理数据 + switch(pack_msg_type) + { + case CMD_BLE_TO_MK: + memcpy(&dev_id,&mUsart2ReceivePack[0],2); + bat_percent=mUsart2ReceivePack[2]; + memcpy(&set_mk_time,&mUsart2ReceivePack[3],2); + memcpy(&g_com_map[DEV_ID],&dev_id,2); + memcpy(&g_com_map[SET_START_TIME],&set_mk_time,2); + Send_Reply_To_Ble(); + LOG_INFO(TRACE_MODULE_APP,"收到蓝牙数据 set_mk_time %d,dev_id %04x,bat_percent %d\r\n",set_mk_time,dev_id,bat_percent); + save_com_map_to_flash(); + //memcpy((uint8_t*)&g_com_map + pack_param_addr*2, mUsart2ReceivePack, pack_datalen); + + break; +// case CMD_MK_TO_BLE: +// //uart0_send_ComMap_to_BLE(pack_datalen,pack_param_addr); +// // break; -//// case CMD_MK_TO_BLE: -//// //uart0_send_ComMap_to_BLE(pack_datalen,pack_param_addr); -//// +//// 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; -// } -// } -// -// // 重置状态机 -// usart0_receive_state = Usart0ReceiveWaitHead0; -// index = 0; -// frame_index = 0; -// break; -// -// default: -// usart0_receive_state = Usart0ReceiveWaitHead0; -// index = 0; -// frame_index = 0; -// break; -// } + default: + break; + } + } + + // 重置状态机 + usart0_receive_state = Usart0ReceiveWaitHead0; + index = 0; + frame_index = 0; + break; + + default: + usart0_receive_state = Usart0ReceiveWaitHead0; + index = 0; + frame_index = 0; + break; + } } diff --git a/keil/include/main/main.c b/keil/include/main/main.c index 63c43e5..03c07bf 100644 --- a/keil/include/main/main.c +++ b/keil/include/main/main.c @@ -507,12 +507,12 @@ //Lora_Tx_Poll(); } Lora_Tx_Poll(); - if(!gpio_pin_get_val(SLEEP_PIN)) - { - //gpio_pin_clr(LORA_NRST);//lora休眠 - LOG_INFO(TRACE_MODULE_APP, "进入休眠模式\r\n"); - mcu_deep_sleep(); - } +// if(!gpio_pin_get_val(SLEEP_PIN)) +// { +// //gpio_pin_clr(LORA_NRST);//lora休眠 +// LOG_INFO(TRACE_MODULE_APP, "进入休眠模式\r\n"); +// mcu_deep_sleep(); +// } IdleTask(); } } @@ -521,7 +521,7 @@ LOG_INFO(TRACE_MODULE_APP, "进入休眠模式\r\n"); //gpio_pin_clr(LORA_NRST);//lora休眠 // spi_close(SPI_ID0); - //lora_in_sleep(); + lora_in_sleep(); power_init(); mcu_deep_sleep(); } diff --git a/keil/include/src/Radio/lora_1268.c b/keil/include/src/Radio/lora_1268.c index e3c848a..dccdedf 100644 --- a/keil/include/src/Radio/lora_1268.c +++ b/keil/include/src/Radio/lora_1268.c @@ -370,7 +370,8 @@ // gpio_pin_clr(LORA_IRQ); //gpio_pin_clr(LORA_NRST); //gpio_pin_clr(LORA_NRST);//lora休眠 - Radio.Standby(); +// Radio.Standby(); + Radio.Sleep(); } ////States_t State = LOWPOWER; @@ -396,8 +397,9 @@ if(flag_writepara_needreset) //配置写入完成设备需要重启 { - printf("网关下发配置写入完成,重启"); - SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader + LOG_INFO(TRACE_MODULE_APP,"网关下发配置写入完成,重启\r\n"); +// SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader + sys_reset(0); } Radio.Standby(); if(LoraUp_flag) @@ -445,6 +447,7 @@ uint8_t rxdone=0; extern uint16_t set_mk_time; extern mk_send_message_to_BLE(void); +uint8_t tt4=1; void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ) { uint16_t checksum1; @@ -522,6 +525,7 @@ LoraSendComMap(WGRSP_RWTAG_READ); break; case WGRSP_RWTAG_WRITE: + rec_index = RX_Buffer[PWTAG_WRITE_IDX_IDX]; switch(rec_index) { @@ -534,18 +538,17 @@ default : memcpy(&rec_value,&RX_Buffer[PWTAG_WRITE_VALUE_IDX],2); g_com_map[rec_index/2] = rec_value; -// if(rec_index/2==POWER)//新增判断 -// { -// memcpy(&set_mk_time,&RX_Buffer[PWTAG_WRITE_VALUE_IDX],2); -// //mk_send_message_to_BLE(); //发送给蓝牙 -// //LOG_INFO(TRACE_MODULE_APP, "修改成功g_com表为%#x,时间为%#x\r\n",g_com_map[POWER],set_mk_time); -// } - // save_com_map_to_flash(); + if(rec_index/2==POWER)//新增判断 + { + memcpy(&set_mk_time,&RX_Buffer[PWTAG_WRITE_VALUE_IDX],2); + mk_send_message_to_BLE(); //发送给蓝牙 + //LOG_INFO(TRACE_MODULE_APP, "修改成功g_com表为%#x,时间为%#x\r\n",g_com_map[POWER],set_mk_time); + } + save_com_map_to_flash(); LoraRspWriteCommap(SUBMSG_WRITE_ANCPARA); flag_writepara_needreset = 1; no_rx_flag = 1; } - break; case WGRSP_RWTAG_UPDATE: rec_index = RX_Buffer[PWTAG_WRITE_IDX_IDX]; @@ -571,7 +574,7 @@ } } -LOG_INFO(TRACE_MODULE_APP, "进入回复2\r\n"); + if(!no_rx_flag) { if(lora_jianting_flag&&LoraUp_flag==0) @@ -580,6 +583,7 @@ Radio.Rx(0); } } + } void OnTxTimeout( void ) -- Gitblit v1.9.3