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