From 4bdcef16fd860b674793c435288ed3afb50ddabe Mon Sep 17 00:00:00 2001 From: yincheng.zhong <634916154@qq.com> Date: 星期六, 03 六月 2023 11:38:07 +0800 Subject: [PATCH] V2.17 Z增加参数保护,有bug --- Src/application/serial_at_cmd_app.c | 40 ++++++++++++++++++++++++++-------------- 1 files changed, 26 insertions(+), 14 deletions(-) diff --git a/Src/application/serial_at_cmd_app.c b/Src/application/serial_at_cmd_app.c index 5c27a80..5ef7770 100644 --- a/Src/application/serial_at_cmd_app.c +++ b/Src/application/serial_at_cmd_app.c @@ -17,7 +17,8 @@ UsartReceiveWaitIndex, UsartReceiveWaitDataLen, UsartReceiveWaitData, - UsartReceiveWaitChecksum + UsartReceiveWaitChecksum1, + UsartReceiveWaitChecksum2 }UsartRecvPackState; uint8_t mUsartReceivePack[100] = {0}; @@ -42,27 +43,30 @@ UART_PushFrame(send_frame, data_length+9); } - +uint16_t checksum2 = 0; +u8 usart_checksum[2]; void UsartParseDataHandler(uint8_t data) { 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; + if(usart_receive_state == UsartReceiveWaitChecksum2) { //若收到校验和包 + checksum2 = 0; for(int i = 0; i<pack_length-5; i++) { - checksum += mUsartReceivePack[i]; + checksum2 += mUsartReceivePack[i]; } - checksum += pack_cmd; - checksum += pack_length; - checksum += pack_index; - checksum += pack_datalen; - checksum += pack_msgtype; - if(((data + checksum)&0xff) == 0xFF) //校验通过 + checksum2 += pack_cmd; + checksum2 += pack_length; + checksum2 += pack_index; + checksum2 += pack_datalen; + checksum2 += pack_msgtype; + checksum2=~checksum2; + usart_checksum[1] = data; + if(checksum2==(usart_checksum[0]|usart_checksum[1]<<8)) //校验通过 { switch(pack_cmd) { @@ -92,6 +96,11 @@ delay_ms(100); SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader } + if(g_com_map[CNT_RESTART]==1) + { + SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader + } + //返回一个error状态 //SendComMap(pack_datalen,pack_index); save_com_map_to_flash(); @@ -115,12 +124,15 @@ mUsartReceivePack[index] = data; index++; if(index == pack_length-5) { //如果收到的index与长度相等 - usart_receive_state = UsartReceiveWaitChecksum; + usart_receive_state = UsartReceiveWaitChecksum1; } } else if(usart_receive_state == UsartReceiveWaitDataLen) { //收到指令类型字节 pack_datalen = data; usart_receive_state = UsartReceiveWaitData; - }else if(usart_receive_state == UsartReceiveWaitIndex) { //收到指令类型字节 + }else if(usart_receive_state == UsartReceiveWaitChecksum1) { + usart_checksum[0] = data; + usart_receive_state = UsartReceiveWaitChecksum2; + }else if(usart_receive_state == UsartReceiveWaitIndex) { //收到指令类型字节 pack_index = data; usart_receive_state = UsartReceiveWaitDataLen; } else if(usart_receive_state == UsartReceiveWaitCMD) { //收到指令类型字节 -- Gitblit v1.9.3