Browse Source

串口接收方式采用循环buffer模式接收,不远程free,但出现其他硬件错误

LAPTOP-KB7QFH2U\ChenJie-PC 2 years ago
parent
commit
f5bc396eac
7 changed files with 84 additions and 226 deletions
  1. 1 1
      Project_Settings/Startup_Code/exceptions.c
  2. 3 6
      src/AppTaskGps.c
  3. 16 42
      src/AppTaskUart0.c
  4. 33 113
      src/AppTaskUart1.c
  5. 26 59
      src/hal_adapter.c
  6. 3 3
      src/hal_adapter.h
  7. 2 2
      src/main.c

+ 1 - 1
Project_Settings/Startup_Code/exceptions.c

@@ -87,7 +87,7 @@ void NMI_Handler(void)
 }
 void HardFault_Handler(void)
 {
-	ASM_KEYWORD("bx lr");
+//	ASM_KEYWORD("bx lr");
     while(TRUE){};
 }
 void MemManage_Handler(void)

+ 3 - 6
src/AppTaskGps.c

@@ -18,16 +18,13 @@ void GpsTask(void *pvParameters)
 	while(1)
 	{
 		vTaskDelay(pdMS_TO_TICKS(10));
+		UartRecvPtr = malloc(256);
 		UART_Receive_Data(UART_LPUART2,&UartRecvPtr,&pReadLen,1000);
 		if(pReadLen>0)
 		{
 			GpsDataDecode(UartRecvPtr);
-			if(UartRecvPtr != NULL)
-			{
-				free(UartRecvPtr);
-			}
-			UartRecvPtr = NULL;
 		}
+		free(UartRecvPtr);
 	}
 }
 void GpsDataDecode(uint8 *msg)
@@ -103,7 +100,7 @@ void GpsDataDecode(uint8 *msg)
 //		GpsInfoData.AccMileage[3] = AppDataInfo.AccMileage;
 	}
 	p2 = strtok(p2, ","); //ֻȡµÚ2ÐеÄÐÅÏ¢GGA
-	memset(databuffer, 0x30, 20);
+	memset(databuffer, 0x00, 20);
 	if (strcmp(p2, "$GNGGA") == 0)
 	{
 		index = 0;

+ 16 - 42
src/AppTaskUart0.c

@@ -22,6 +22,7 @@ void Uart0Task(void *pvParameters)
 	UartAnsType UartAnsData;
 	static uint8 writecounter = 0;
 	uint16 UartNoDataReadCounter = 0;
+	uint8 UartDataRecv[256];
 	while (1)
 	{
 		switch (gProcess_Uart0_Task)
@@ -44,7 +45,6 @@ void Uart0Task(void *pvParameters)
 
 			static uint16 readCnt = 0;
 			/*电压电流数据读取(第一次读取)*/
-			uint8 *UartDataRecv = NULL;
 			pReadLen = 0;
 			Dio_FlipChannel(DioConf_DioChannel_PTE1_GPIO_OUT_MCU_LED2);
 			RegAddrBegin = 0x00;
@@ -67,7 +67,7 @@ void Uart0Task(void *pvParameters)
 			memset((uint8 *)&UartAnsData,0x00,sizeof(UartAnsData));
 			while(1)
 			{
-				UART_Receive_Data(UART_LPUART0, &UartDataRecv, &pReadLen, 100);
+				UART_Receive_Data(UART_LPUART0, UartDataRecv, &pReadLen, 100);
 				if(pReadLen>2)
 				{
 					memcpy((uint8 *)&UartAnsData+ReadLen1,UartDataRecv,pReadLen);
@@ -77,11 +77,6 @@ void Uart0Task(void *pvParameters)
 				{
 					ReadDelayCounter++;
 				}
-				if(UartDataRecv!=NULL)
-				{
-					free(UartDataRecv);
-				}
-				UartDataRecv=NULL;
 				if(ReadLen1>=ReadLenTar)
 				{
 					ReadDelayCounter = 0;
@@ -136,7 +131,7 @@ void Uart0Task(void *pvParameters)
 			ReadLenTar = (Reg_Num)*2+5;
 			while(1)
 			{
-				UART_Receive_Data(UART_LPUART0, &UartDataRecv, &pReadLen, 100);
+				UART_Receive_Data(UART_LPUART0, UartDataRecv, &pReadLen, 100);
 				if(pReadLen>2)
 				{
 					memcpy((uint8 *)&UartAnsData+ReadLen1,UartDataRecv,pReadLen);
@@ -146,11 +141,6 @@ void Uart0Task(void *pvParameters)
 				{
 					ReadDelayCounter++;
 				}
-				if(UartDataRecv!=NULL)
-				{
-					free(UartDataRecv);
-				}
-				UartDataRecv=NULL;
 				if(ReadLen1>=ReadLenTar)
 				{
 					ReadDelayCounter = 0;
@@ -204,7 +194,6 @@ void Uart0Task(void *pvParameters)
 					static uint16 pt[2] = {0};
 					static uint16 ct[2] = {0};
 					pReadLen = 0;
-					uint8 *UartRecvPtr=NULL;
 					RegAddrBegin = 0x03;
 					Reg_Num = 0x02;
 					Uart0AskMsg.Bms_Address = METER1_ADDRESS_CODE+i;//第一次读02,第二次读03
@@ -217,25 +206,20 @@ void Uart0Task(void *pvParameters)
 					Uart0AskMsg.CRC_L = CRC_chk_buffer;
 					Uart0AskMsg.CRC_H = CRC_chk_buffer >> 8;
 					UART_Send_Data(UART_LPUART0, (uint8 *)&Uart0AskMsg, sizeof(Uart0AskMsg), 100);
-					UART_Receive_Data(UART_LPUART0, &UartRecvPtr, &pReadLen, 1000);
+					UART_Receive_Data(UART_LPUART0, UartDataRecv, &pReadLen, 1000);
 					//电表数据解析
 					if (pReadLen > 5)
 					{
 						uint16 CrcChkGet = 0xffff;
 						uint16 CrcChkCal = 0x0000;
-						CrcChkCal = crc_chk(UartRecvPtr, pReadLen-2);
-						CrcChkGet =  ((uint16)(*(UartRecvPtr+pReadLen-1))<<8) | ((uint16)(*(UartRecvPtr+pReadLen-2)));
+						CrcChkCal = crc_chk(UartDataRecv, pReadLen-2);
+						CrcChkGet =  ((uint16)(*(UartDataRecv+pReadLen-1))<<8) | ((uint16)(*(UartDataRecv+pReadLen-2)));
 						if(CrcChkCal==CrcChkGet)
 						{
-							pt[i] = ((uint16)(*(UartRecvPtr+3))<<8) | ((uint16)(*(UartRecvPtr+4)));
-							ct[i] = ((uint16)(*(UartRecvPtr+5))<<8) | ((uint16)(*(UartRecvPtr+6)));
+							pt[i] = ((uint16)(*(UartDataRecv+3))<<8) | ((uint16)(*(UartDataRecv+4)));
+							ct[i] = ((uint16)(*(UartDataRecv+5))<<8) | ((uint16)(*(UartDataRecv+6)));
 						}
 					}
-					if(UartRecvPtr!=NULL)
-					{
-						free(UartRecvPtr);
-					}
-					UartRecvPtr=NULL;
 					/*电表电量数据读取*/
 					pReadLen = 0;
 					RegAddrBegin = 0x3F;
@@ -250,29 +234,24 @@ void Uart0Task(void *pvParameters)
 					Uart0AskMsg.CRC_L = CRC_chk_buffer;
 					Uart0AskMsg.CRC_H = CRC_chk_buffer >> 8;
 					UART_Send_Data(UART_LPUART0, (uint8 *)&Uart0AskMsg, sizeof(Uart0AskMsg), 100);
-					UART_Receive_Data(UART_LPUART0, &UartRecvPtr, &pReadLen, 1000);
+					UART_Receive_Data(UART_LPUART0, UartDataRecv, &pReadLen, 1000);
 					//电表数据解析
 					if (pReadLen > 5)
 					{
 						uint16 CrcChkGet = 0xffff;
 						uint16 CrcChkCal = 0x0000;
-						CrcChkCal = crc_chk(UartRecvPtr, pReadLen-2);
-						CrcChkGet =  ((uint16)(*(UartRecvPtr+pReadLen-1))<<8) | ((uint16)(*(UartRecvPtr+pReadLen-2)));
+						CrcChkCal = crc_chk(UartDataRecv, pReadLen-2);
+						CrcChkGet =  ((uint16)(*(UartDataRecv+pReadLen-1))<<8) | ((uint16)(*(UartDataRecv+pReadLen-2)));
 						if(CrcChkCal==CrcChkGet)
 						{
 							//meterAllPwr[i] = pt[i]*ct[i]*(((uint32)(*(UartRecvPtr+3))<<24)|((uint32)(*(UartRecvPtr+4))<<16)|((uint32)(*(UartRecvPtr+5))<<8) | ((uint32)(*(UartRecvPtr+6))));
-							meterPosPwr[i] = pt[i]*ct[i]*((uint32)(*(UartRecvPtr+3))<<24)|((uint32)(*(UartRecvPtr+4))<<16)|((uint32)(*(UartRecvPtr+5))<<8) | ((uint32)(*(UartRecvPtr+6)));
-							meterNegPwr[i] = pt[i]*ct[i]*((uint32)(*(UartRecvPtr+7))<<24)|((uint32)(*(UartRecvPtr+8))<<16)|((uint32)(*(UartRecvPtr+9))<<8) | ((uint32)(*(UartRecvPtr+10)));
+							meterPosPwr[i] = pt[i]*ct[i]*((uint32)(*(UartDataRecv+3))<<24)|((uint32)(*(UartDataRecv+4))<<16)|((uint32)(*(UartDataRecv+5))<<8) | ((uint32)(*(UartDataRecv+6)));
+							meterNegPwr[i] = pt[i]*ct[i]*((uint32)(*(UartDataRecv+7))<<24)|((uint32)(*(UartDataRecv+8))<<16)|((uint32)(*(UartDataRecv+9))<<8) | ((uint32)(*(UartDataRecv+10)));
 							meterPosPwr[i] = meterPosPwr[i] * 100;
 							meterNegPwr[i] = meterNegPwr[i] * 100;
 							meterAllPwr[i] = meterPosPwr[i] + meterNegPwr[i];
 						}
 					}
-					if(UartRecvPtr!=NULL)
-					{
-						free(UartRecvPtr);
-					}
-					UartRecvPtr=NULL;
 				}
 			}
 			readCnt++;
@@ -286,6 +265,7 @@ void Uart0Task(void *pvParameters)
 				uint16 RegAddress = 0;
 				uint16 CRC_chk_buffer = 0;
 				uint8 WriteData[2] = {0x00,0x00};
+				uint8 UartRecvBuffer[10];
 				if(!battSeparateCtlState)
 				{
 					setbit(WriteData[0],7);
@@ -307,9 +287,8 @@ void Uart0Task(void *pvParameters)
 				CRC_chk_buffer = crc_chk((uint8 *)&Uart_Write_Msg, sizeof(Uart_Write_Msg) - 2);
 				Uart_Write_Msg.CRC_L = CRC_chk_buffer;
 				Uart_Write_Msg.CRC_H = CRC_chk_buffer >> 8;
-				uint8 *UartRecvPtr = NULL;
-				UART_Query_Data(UART_LPUART0,UART_LPUART0,(uint8 *)&Uart_Write_Msg,sizeof(Uart_Write_Msg),&UartRecvPtr, &pReadLen,500);
-				if (pReadLen>3&&*(UartRecvPtr+1) == 0x10)
+				UART_Query_Data(UART_LPUART0,UART_LPUART0,(uint8 *)&Uart_Write_Msg,sizeof(Uart_Write_Msg),UartRecvBuffer, &pReadLen,500);
+				if (pReadLen>3&&*(UartRecvBuffer+1) == 0x10)
 				{
 					writecounter = 0;
 					battSeparateEnable = 0;
@@ -318,11 +297,6 @@ void Uart0Task(void *pvParameters)
 				{
 					writecounter++;
 				}
-				if(UartRecvPtr != NULL)
-				{
-					free(UartRecvPtr);
-				}
-				UartRecvPtr = NULL;
 			}
 			if(writecounter>=5)
 			{

+ 33 - 113
src/AppTaskUart1.c

@@ -45,13 +45,13 @@ static void AtcmdTransmit(sint8 CmdIdx, uint8 *SetValuePtr, uint16 SetValueLen,
 static void TcpDataInfoRecvHandle(uint8 *DataRecv, uint16 DataRecvLen);
 static void GetCSQValue(uint8 *out);
 void Fota_Ftp(uint8 *dataPtrIn);
-void tcpUdsFunc(Ptr,TcpCmdAnswer);
+void tcpUdsFunc(uint8 *Ptr,uint8 *AnsPtr);
 void Uart_4G_Task(void *pvParameters)
 {
 	(void)pvParameters;
 	uint32 SendTimerCounter = 0;
 	uint32 RecvTimerDelay = 0;
-	uint8 *UartRecvPtr=NULL;
+	uint8 UartRecvPtr[200];
 	volatile uint16 tcpErrorCounter = 0;
 	uint16 pReadLen = 0;
 	// 4G开机
@@ -70,7 +70,7 @@ void Uart_4G_Task(void *pvParameters)
 		{
 		case PROCESS_TCP_IDLE: //空闲状态
 		{
-			UART_Receive_Data(UART_LPUART1, &UartRecvPtr, &pReadLen, 100);//100ms检测
+			UART_Receive_Data(UART_LPUART1, UartRecvPtr, &pReadLen, 100);//100ms检测
 			if (SocketId < 0)
 			{
 				PROC_TCP_STATE_SWITCH(PROCESS_TCP_REGCHK);
@@ -159,11 +159,6 @@ void Uart_4G_Task(void *pvParameters)
 			{
 				TcpDataInfoRecvHandle(UartRecvPtr, pReadLen);
 			}
-			if(UartRecvPtr != NULL)
-			{
-				free(UartRecvPtr);
-			}
-			UartRecvPtr = NULL;
 			PROC_TCP_STATE_SWITCH(PROCESS_TCP_IDLE);
 			break;
 		}
@@ -224,6 +219,7 @@ sint8 TcpConnectFunc(sint8 *ConnectId)
 	uint8 ConnectStep = 0;
 	sint8 ChkState = 0;
 	sint8 ATRet = -1;
+	uint8 UartRecvPtr[100];
 	while (1)
 	{
 		switch (ConnectStep)
@@ -233,19 +229,11 @@ sint8 TcpConnectFunc(sint8 *ConnectId)
 			char *ATCmdSend = (char *)("ATE0\r\n");
 			uint8 ATCmdSendLen = mstrlen(ATCmdSend);
 			uint8 ReadLen = 0;
-			uint8 *UartRecvPtr = NULL;
-			UART_Query_Data(UART_LPUART1, UART_LPUART1, ATCmdSend, ATCmdSendLen,&UartRecvPtr, &ReadLen, pdMS_TO_TICKS(1000));
+			UART_Query_Data(UART_LPUART1, UART_LPUART1, (uint8 *)ATCmdSend, ATCmdSendLen,UartRecvPtr, &ReadLen, pdMS_TO_TICKS(1000));
 			uint8 *retptr = NULL;
 			if (ReadLen > 0)
 			{
 				retptr = (uint8 *)strstr((char *)UartRecvPtr, (char *)("OK"));
-
-				if(UartRecvPtr != NULL)
-				{
-					free(UartRecvPtr);
-				}
-				UartRecvPtr = NULL;
-
 				if (retptr)
 				{
 					ConnectStep++;
@@ -299,7 +287,7 @@ sint8 TcpConnectFunc(sint8 *ConnectId)
 			memcpy(AtCmdSend, WebSiteName, AtCmdSendLen);
 			memcpy(AtCmdSend + AtCmdSendLen, (char *)CRLF, sizeof(CRLF));
 			AtCmdSendLen = AtCmdSendLen + 2;
-			AtcmdTransmit(AT_CGIP, AtCmdSend, AtCmdSendLen, &ATRet,5000);
+			AtcmdTransmit(AT_CGIP, (uint8 *)AtCmdSend, AtCmdSendLen, &ATRet,5000);
 			if (ATRet == 0)
 			{
 				ConnectStep++;
@@ -324,7 +312,7 @@ sint8 TcpConnectFunc(sint8 *ConnectId)
 			/**/
 			sprintf(AtCmdSend, "%d,\"TCP\",%s,%d\r\n", *ConnectId, WebSiteIp, WebSitePort); //此处需要优化
 			AtCmdSendTotalLen = mstrlen(AtCmdSend);
-			AtcmdTransmit(AT_CONNECT, AtCmdSend, AtCmdSendTotalLen, &ATRet,10000);
+			AtcmdTransmit(AT_CONNECT, (uint8 *)AtCmdSend, AtCmdSendTotalLen, &ATRet,10000);
 			if (ATRet == 0)
 			{
 				ConnectStep++;
@@ -409,8 +397,9 @@ void InitFunc(void)
 	uint8 ReadLen = 0;
 	char *ATCmdSend = NULL;
 	uint8 ATCmdSendLen = 0;
-	uint8 *UartRecvPtr = NULL;
-	uint8 ATerrorCnt = 0;
+	uint8 UartRecvPtr[50];
+	uint16 ATerrorCnt = 0;
+	uint8 *retptr = NULL;
 	while (1)
 	{
 		switch (_4G_InitStep)
@@ -438,8 +427,7 @@ void InitFunc(void)
 		{
 			ATCmdSend = (char *)("ATE0\r\n");
 			ATCmdSendLen = mstrlen(ATCmdSend);
-			UART_Query_Data(UART_LPUART1, UART_LPUART1, ATCmdSend, ATCmdSendLen, &UartRecvPtr, &ReadLen, pdMS_TO_TICKS(10000));
-			uint8 *retptr = NULL;
+			UART_Query_Data(UART_LPUART1, UART_LPUART1, (uint8 *)ATCmdSend, ATCmdSendLen, UartRecvPtr, &ReadLen, pdMS_TO_TICKS(10000));
 			if (ReadLen > 0)
 			{
 				retptr = (uint8 *)strstr((char *)UartRecvPtr, (char *)("OK"));
@@ -456,20 +444,13 @@ void InitFunc(void)
 			{
 				_4G_InitStep=0;
 			}
-			if(UartRecvPtr != NULL)
-			{
-				free(UartRecvPtr);
-			}
-			UartRecvPtr = NULL;
 			break;
 		}
 		case 2: // IMEI获取
 		{
 			ATCmdSend = (char *)("AT+SIMEI?\r\n");
 			ATCmdSendLen = mstrlen(ATCmdSend);
-			UART_Query_Data(UART_LPUART1, UART_LPUART1, ATCmdSend, ATCmdSendLen, &UartRecvPtr, &ReadLen, pdMS_TO_TICKS(100));
-
-			uint8 *retptr = NULL;
+			UART_Query_Data(UART_LPUART1, UART_LPUART1, (uint8 *)ATCmdSend, ATCmdSendLen, UartRecvPtr, &ReadLen, pdMS_TO_TICKS(100));
 			if (ReadLen > 0)
 			{
 				retptr = (uint8 *)strstr((char *)UartRecvPtr, (char *)("+SIMEI"));
@@ -487,19 +468,13 @@ void InitFunc(void)
 			{
 				_4G_InitStep = 0;
 			}
-			if(UartRecvPtr != NULL)
-			{
-				free(UartRecvPtr);
-			}
-			UartRecvPtr = NULL;
 			break;
 		}
 		case 3: // 打开时间自动更新
 		{
 			ATCmdSend = (char *)("AT+CTZU=1\r\n");
 			ATCmdSendLen = mstrlen(ATCmdSend);
-			UART_Query_Data(UART_LPUART1, UART_LPUART1, ATCmdSend, ATCmdSendLen, &UartRecvPtr, &ReadLen, pdMS_TO_TICKS(100));
-			uint8 *retptr = NULL;
+			UART_Query_Data(UART_LPUART1, UART_LPUART1, (uint8 *)ATCmdSend, ATCmdSendLen, UartRecvPtr, &ReadLen, pdMS_TO_TICKS(100));
 			if (ReadLen > 0)
 			{
 				retptr = (uint8 *)strstr((char *)UartRecvPtr, (char *)("OK"));
@@ -512,11 +487,6 @@ void InitFunc(void)
 			{
 				_4G_InitStep = 0;
 			}
-			if(UartRecvPtr != NULL)
-			{
-				free(UartRecvPtr);
-			}
-			UartRecvPtr = NULL;
 			break;
 		}
 		case 4: // ICCID获取
@@ -536,8 +506,7 @@ void InitFunc(void)
 		{
 			ATCmdSend = (char *)("AT+CIPSENDMODE=0\r\n");
 			ATCmdSendLen = mstrlen(ATCmdSend);
-			UART_Query_Data(UART_LPUART1, UART_LPUART1, ATCmdSend, ATCmdSendLen, &UartRecvPtr, &ReadLen, pdMS_TO_TICKS(100));
-			uint8 *retptr = NULL;
+			UART_Query_Data(UART_LPUART1, UART_LPUART1, (uint8 *)ATCmdSend, ATCmdSendLen, UartRecvPtr, &ReadLen, pdMS_TO_TICKS(100));
 			if (ReadLen > 0)
 			{
 				retptr = (uint8 *)strstr((char *)UartRecvPtr, (char *)("OK"));
@@ -550,11 +519,6 @@ void InitFunc(void)
 			{
 				_4G_InitStep = 0;
 			}
-			if(UartRecvPtr != NULL)
-			{
-				free(UartRecvPtr);
-			}
-			UartRecvPtr = NULL;
 		}
 		default:
 		{
@@ -570,7 +534,7 @@ static void AtcmdTransmit(sint8 CmdIdx, uint8 *SetValuePtr, uint16 SetValueLen,
 	uint8 *PtrATCmdSend = NULL;
 	uint8 ATCmdFixedLen = 0;
 	uint16 ATCmdTotalLen = 0;
-	uint8 *UartRecvPtr=NULL;
+	uint8 UartRecvPtr[100];
 	ATCmdFixedLen = mstrlen(Atcmdfunc[CmdIdx].str);
 	ATCmdTotalLen = ATCmdFixedLen + SetValueLen;
 	PtrATCmdSend = malloc(ATCmdTotalLen + 1);
@@ -581,10 +545,10 @@ static void AtcmdTransmit(sint8 CmdIdx, uint8 *SetValuePtr, uint16 SetValueLen,
 		memcpy(PtrATCmdSend + ATCmdFixedLen, SetValuePtr, SetValueLen);
 	}
 
-	UART_Query_Data(UART_LPUART1, UART_LPUART1, PtrATCmdSend, ATCmdTotalLen, &UartRecvPtr, &ReadLen, timeout);
+	UART_Query_Data(UART_LPUART1, UART_LPUART1, PtrATCmdSend, ATCmdTotalLen, UartRecvPtr, &ReadLen, timeout);
 	if(ReadLen>0)
 	{
-		*retFunc = Atcmdfunc[CmdIdx].cb(PtrATCmdSend, UartRecvPtr, CmdIdx, ReadLen);
+		*retFunc = Atcmdfunc[CmdIdx].cb((char *)PtrATCmdSend, UartRecvPtr, CmdIdx, ReadLen);
 	}
 	else
 	{
@@ -592,17 +556,9 @@ static void AtcmdTransmit(sint8 CmdIdx, uint8 *SetValuePtr, uint16 SetValueLen,
 	}
 	if (PtrATCmdSend != NULL)
 	{
-		memset(PtrATCmdSend, 0x00, ATCmdTotalLen + 1);
 		free(PtrATCmdSend);
 	}
 	PtrATCmdSend = NULL;
-
-	if(UartRecvPtr != NULL)
-	{
-		free(UartRecvPtr);
-	}
-	UartRecvPtr = NULL;
-
 	return;
 }
 sint8 at_callbackFunc(char *PSendStr, char *pReadStr, uint8 CmdIdx, uint16 pReadLen)
@@ -1145,8 +1101,8 @@ void GetUtc8Time(UTC8TimeType *UTC8TimeTcp)
 	uint8 AtCmdLen = mstrlen(AtCmdAsk);
 	uint8 ReadLen = 0;
 	uint8 *retptr = NULL;
-	uint8 *UartRecvPtr=NULL;
-	UART_Query_Data(UART_LPUART1, UART_LPUART1, AtCmdAsk, AtCmdLen, &UartRecvPtr, &ReadLen, pdMS_TO_TICKS(100));
+	uint8 UartRecvPtr[30];
+	UART_Query_Data(UART_LPUART1, UART_LPUART1, (uint8 *)AtCmdAsk, AtCmdLen, UartRecvPtr, &ReadLen, pdMS_TO_TICKS(100));
 	if (ReadLen > 0)
 	{
 		if ((uint8 *)strstr((char *)UartRecvPtr, (char *)("OK")))
@@ -1159,11 +1115,6 @@ void GetUtc8Time(UTC8TimeType *UTC8TimeTcp)
 			UTC8TimeTcp->minute = CharToHex(*(retptr + 20)) * 10 + CharToHex(*(retptr + 21));
 			UTC8TimeTcp->second = CharToHex(*(retptr + 23)) * 10 + CharToHex(*(retptr + 24));
 		}
-		if(UartRecvPtr != NULL)
-		{
-			free(UartRecvPtr);
-		}
-		UartRecvPtr = NULL;
 	}
 }
 static void GetCSQValue(uint8 *out)
@@ -1172,8 +1123,8 @@ static void GetCSQValue(uint8 *out)
 	uint8 AtCmdLen = mstrlen(AtCmdAsk);
 	uint8 ReadLen = 0;
 	uint8 *retptr = NULL;
-	uint8 *UartRecvPtr=NULL;
-	UART_Query_Data(UART_LPUART1, UART_LPUART1, AtCmdAsk, AtCmdLen, &UartRecvPtr, &ReadLen, pdMS_TO_TICKS(100));
+	uint8 UartRecvPtr[30];
+	UART_Query_Data(UART_LPUART1, UART_LPUART1, (uint8 *)AtCmdAsk, AtCmdLen, UartRecvPtr, &ReadLen, pdMS_TO_TICKS(100));
 	*out = 99;
 	if (ReadLen > 0)
 	{
@@ -1192,12 +1143,6 @@ static void GetCSQValue(uint8 *out)
 			}
 			*out = atoi(CsqStr);
 		}
-
-		if(UartRecvPtr != NULL)
-		{
-			free(UartRecvPtr);
-		}
-		UartRecvPtr = NULL;
 	}
 	return;
 }
@@ -1209,7 +1154,7 @@ static void TcpDataInfoRecvHandle(uint8 *DataRecv, uint16 DataRecvLen)
 	uint16 TcpDataLen = 0;
 	uint16 NumCalTemp = 1;
 	retptr = (uint8 *)strstr((char *)DataRecv, (char *)("\r\n##"));
-	if (retptr == NULL)
+	if (retptr == NULL||DataRecvLen<5)
 		return;
 	for (uint8 i = 0; i < 5; i++)
 	{
@@ -1398,19 +1343,18 @@ sint8 tcpipConnectionSend(uint8 TcpConnectId, uint8 *SendDataPtr, uint16 SendDat
 	sint8 outValue = -1;
 	uint8  sendErrConuter= 0;
 	uint8 ReadLen = 0;
-	char AtCmdSend[20] = {0};
+	char AtCmdSend[30] = {0};
 	uint8 AtCmdSendTotalLen = 0;
-	uint8 *UartRecvPtr1 =NULL;
-	uint8 *UartRecvPtr =NULL;
+	uint8 UartRecvPtr[30];
 	uint8 ret = 0;
 	sprintf(AtCmdSend, "AT+CIPSEND=%d,%d\r\n", TcpConnectId, SendDataLen);
 	AtCmdSendTotalLen = mstrlen(AtCmdSend);
 	while(outValue!=0&&sendErrConuter<3)
 	{
-		ret = UART_Query_Data(UART_LPUART1, UART_LPUART1, (uint8 *)AtCmdSend, AtCmdSendTotalLen, &UartRecvPtr1, &ReadLen, 5000);
-		if (ret==0&&ReadLen>0&&(uint8 *)strstr((char *)UartRecvPtr1, (char *)(">"))||0)//一个字节收不到的问题,IDE中断间隔过大不行
+		ret = UART_Query_Data(UART_LPUART1, UART_LPUART1, (uint8 *)AtCmdSend, AtCmdSendTotalLen, UartRecvPtr, &ReadLen, 5000);
+		if (((ret==0)&&(ReadLen>0)&&((uint8 *)strstr((char *)UartRecvPtr, (char *)(">"))))||0)//一个字节收不到的问题,IDE中断间隔过大不行
 		{
-			UART_Query_Data(UART_LPUART1, UART_LPUART1, (uint8 *)SendDataPtr, SendDataLen, &UartRecvPtr, &ReadLen, 5000);
+			UART_Query_Data(UART_LPUART1, UART_LPUART1, (uint8 *)SendDataPtr, SendDataLen, UartRecvPtr, &ReadLen, 5000);
 			if (ReadLen>0&&(uint8 *)strstr((char *)UartRecvPtr, (char *)("\r\nOK\r\n\r\n+CIPSEND")))
 			{
 				outValue = 0;
@@ -1427,16 +1371,6 @@ sint8 tcpipConnectionSend(uint8 TcpConnectId, uint8 *SendDataPtr, uint16 SendDat
 			sendErrConuter++;
 		}
 	}
-	if(UartRecvPtr != NULL)
-	{
-		free(UartRecvPtr);
-	}
-	UartRecvPtr = NULL;
-	if(UartRecvPtr1 != NULL)
-	{
-		free(UartRecvPtr1);
-	}
-	UartRecvPtr1 = NULL;
 	return outValue;
 }
 void Fota_Ftp(uint8 *dataPtrIn)
@@ -1445,7 +1379,7 @@ void Fota_Ftp(uint8 *dataPtrIn)
 	char *ATCmdSend = NULL;
 	sint8 recvRet = -1;
 	char ATSendDataBuffer[100] = {0};
-	uint8 *UartRecvPtr = NULL;
+	uint8 UartRecvBuffer[20];
 	uint16 ReadLen = 0;
 	uint8 *retptr = NULL;
 //	char temp[70]=",qx,qx900,120.27.243.131,21,0,0.0.1.5,0.0.1.5,/Debug/V0.0.1.5.bin,";
@@ -1543,7 +1477,6 @@ void Fota_Ftp(uint8 *dataPtrIn)
 		}
 		case 3://transmit zl file from server to module
 		{
-			uint8 *UartData = NULL;
 			memset(ATSendDataBuffer,0x00,sizeof(ATSendDataBuffer));
 			sprintf(ATSendDataBuffer, "AT+CFTPSGETFILE=\"%s/%s\"\r\n", filePathPtr,keyFilename);
 			UART_Send_Data(UART_LPUART1, ATSendDataBuffer, mstrlen(ATSendDataBuffer), pdMS_TO_TICKS(100));
@@ -1601,10 +1534,10 @@ void Fota_Ftp(uint8 *dataPtrIn)
 	        uint16 getDataLenErrCount = 0;
 	        memset(ATSendDataBuffer,0x00,sizeof(ATSendDataBuffer));
 			sprintf(ATSendDataBuffer, "AT+CFTRANTX=\"c:/%s\"\r\n",keyFilename);
-			UART_Query_Data(UART_LPUART1, UART_LPUART1, ATSendDataBuffer, mstrlen(ATSendDataBuffer), &UartRecvPtr, &ReadLen, pdMS_TO_TICKS(5000));
+			UART_Query_Data(UART_LPUART1, UART_LPUART1, ATSendDataBuffer, mstrlen(ATSendDataBuffer), UartRecvBuffer, &ReadLen, pdMS_TO_TICKS(5000));
 			if (ReadLen == (4+45))
 			{
-				retptr = (uint8 *)strstr((char *)UartRecvPtr, (char *)("+CFTRANTX: DATA"));
+				retptr = (uint8 *)strstr((char *)UartRecvBuffer, (char *)("+CFTRANTX: DATA"));
 				if (retptr)
 				{
 					fileLen = (*(retptr+21)<<24)|(*(retptr+22)<<16)|(*(retptr+23)<<8)|(*(retptr+24)<<0);
@@ -1617,6 +1550,7 @@ void Fota_Ftp(uint8 *dataPtrIn)
 					{
 						memset(ATSendDataBuffer,0x00,sizeof(ATSendDataBuffer));
 						sprintf(ATSendDataBuffer, "AT+CFTRANTX=\"c:/%s\",%d,%d\r\n", filenamePtr,currentAddr, readLenAsk);
+						UartData = malloc(readLenAsk+50);
 						UART_Query_Data(UART_LPUART1, UART_LPUART1, ATSendDataBuffer, mstrlen(ATSendDataBuffer), &UartData, &ReadLen, pdMS_TO_TICKS(5000));
 						sprintf(findDataBuffer, "+CFTRANTX: DATA,%d", readLenAsk);
 						if (ReadLen == (readLenAsk+45))
@@ -1636,11 +1570,7 @@ void Fota_Ftp(uint8 *dataPtrIn)
 						{
 							getDataLenErrCount++;
 						}
-						if(UartData != NULL)
-						{
-							free(UartData);
-						}
-						UartData = NULL;
+						free(UartData);
 						if(getDataLenErrCount>=500)
 						{
 							break;
@@ -1656,23 +1586,13 @@ void Fota_Ftp(uint8 *dataPtrIn)
 			{
 				ftp_EndFlg = 1;
 			}
-			if(UartRecvPtr != NULL)
-			{
-				free(UartRecvPtr);
-			}
-			UartRecvPtr = NULL;
 			break;
 		}
 		case 7://delete the bin and zl files
 		{
 	        memset(ATSendDataBuffer,0x00,sizeof(ATSendDataBuffer));
 			sprintf(ATSendDataBuffer, "AT+FSDEL=*.*\r\n");
-			UART_Query_Data(UART_LPUART1, UART_LPUART1, ATSendDataBuffer, mstrlen(ATSendDataBuffer), &UartRecvPtr, &ReadLen, pdMS_TO_TICKS(5000));
-			if(UartRecvPtr != NULL)
-			{
-				free(UartRecvPtr);
-			}
-			UartRecvPtr = NULL;
+			UART_Query_Data(UART_LPUART1, UART_LPUART1, ATSendDataBuffer, mstrlen(ATSendDataBuffer), UartRecvBuffer, &ReadLen, pdMS_TO_TICKS(5000));
 			ftp_process++;
 			Fota_update_flag = TRUE;
 			break;

+ 26 - 59
src/hal_adapter.c

@@ -26,6 +26,8 @@ void create_ringBuffer(ringbuffer_t *ringBuf, uint8_t *buf, uint32_t buf_len);
 void clear_ringBuffer(ringbuffer_t *ringBuf);
 uint32_t write_ringBuffer(uint8_t *buffer, uint32_t size, ringbuffer_t *ringBuf);
 uint32_t read_ringBuffer(uint8_t *buffer, uint32_t size, ringbuffer_t *ringBuf);
+uint8 ringBufferforUart[3][BUFFER_SIZE*2];
+ringbuffer_t uartRingBuffer[3];
 #if UARTPRINTF==1
 	uint8 ringbuffer[1024];
 	ringbuffer_t printfRingBuffer;
@@ -34,12 +36,12 @@ sint8 AtcmdDelayRecvFunc(uint8 recvChannel,char *ResultStrPtr,uint16 delayTime)
 {
 	sint8 outValue = -1;
 	uint8 delayCnt = 0;
-	uint8 *UartData = NULL;
+	uint8 UartData[50];
 	uint16 ReadLen = 0;
 	uint8 *retptr = NULL;
 	while (delayCnt<(delayTime/1000)&&outValue!=0)
 	{
-		UART_Receive_Data(recvChannel,&UartData, &ReadLen,1000);
+		UART_Receive_Data(recvChannel,UartData, &ReadLen,1000);
 		retptr = (uint8 *)strstr((char *)UartData, ResultStrPtr);
 		if (retptr)
 		{
@@ -49,11 +51,6 @@ sint8 AtcmdDelayRecvFunc(uint8 recvChannel,char *ResultStrPtr,uint16 delayTime)
 		{
 			delayCnt++;
 		}
-		if(UartData != NULL)
-		{
-			free(UartData);
-		}
-		UartData = NULL;
 	}
 	return outValue;
 }
@@ -136,9 +133,9 @@ uint32_t read_ringBuffer(uint8_t *buffer, uint32_t size, ringbuffer_t *ringBuf)
     return size;
 }
 
-Std_ReturnType UART_Query_Data(uint8 transChannel, uint8 recvChannel, const uint8 *txBuffer, uint32 sendLength, uint8 **rxBuffer, uint16 *rxlen, uint32 T_timeout)
+Std_ReturnType UART_Query_Data(uint8 transChannel, uint8 recvChannel, uint8 *txBuffer, uint16 sendLength, uint8 *rxBuffer, uint8 *rxlen, uint32 T_timeout)
 {
-	UartMsg_t UartRecvMsg;
+	uint32 queueRecvSize = 0;
 	UartMsg_t UartSendMsg;
 	BaseType_t Sendret = pdFALSE;
 	BaseType_t Recvret = pdFALSE;
@@ -147,14 +144,13 @@ Std_ReturnType UART_Query_Data(uint8 transChannel, uint8 recvChannel, const uint
 	UartSendMsg.dataPrt = txBuffer;
 	*rxlen = 0;
 	Sendret = xQueueSend(UartSendQueue[transChannel],&UartSendMsg,50);
-	memset(&UartRecvMsg,0,sizeof(UartMsg_t));
 	if(Sendret == pdTRUE)
 	{
-		Recvret = xQueueReceive(UartRecvQueue[recvChannel],&UartRecvMsg,T_timeout);
+		Recvret = xQueueReceive(UartRecvQueue[recvChannel],&queueRecvSize,T_timeout);
 		if(Recvret == pdTRUE)
 		{
-			*rxlen = UartRecvMsg.DataLen;
-			*rxBuffer = UartRecvMsg.dataPrt;
+			*rxlen = queueRecvSize;
+			read_ringBuffer(rxBuffer, queueRecvSize, &uartRingBuffer[recvChannel]);
 			retVal = E_OK;
 		}
 		else
@@ -168,17 +164,17 @@ Std_ReturnType UART_Query_Data(uint8 transChannel, uint8 recvChannel, const uint
 	}
 	return retVal;
 }
-Std_ReturnType UART_Receive_Data(uint8 recvChannel, uint8 **rxBuffer, uint16 *rxlen, sint32 T_timeout)
+Std_ReturnType UART_Receive_Data(uint8 recvChannel, uint8 *rxBuffer, uint8 *rxlen, uint32 T_timeout)
 {
-	UartMsg_t UartRecvMsg;
+	uint32 queueRecvSize = 0;
 	BaseType_t ret = pdFALSE;
 	uint32 retVal = E_NOT_OK;
 	*rxlen = 0;
-	ret = xQueueReceive(UartRecvQueue[recvChannel],&UartRecvMsg,T_timeout);
+	ret = xQueueReceive(UartRecvQueue[recvChannel],&queueRecvSize,T_timeout);
 	if(ret == pdTRUE)
 	{
-		*rxlen = UartRecvMsg.DataLen;
-		*rxBuffer = UartRecvMsg.dataPrt;
+		*rxlen = queueRecvSize;
+		read_ringBuffer(rxBuffer, queueRecvSize, &uartRingBuffer[recvChannel]);
 		retVal = E_OK;
 	}
 	return retVal;
@@ -195,17 +191,16 @@ Std_ReturnType UART_Send_Data(uint8 transChannel, const uint8 *txBuffer, uint32
 	{
 		retVal = E_OK;
 	}
-	else
-	{
-		retVal = E_NOT_OK;
-	}
 	return retVal;
 }
  void UartInit(void)
  {
-	 UartRecvQueue[0] = xQueueCreate(6, sizeof(UartMsg_t));
-	 UartRecvQueue[1] = xQueueCreate(6, sizeof(UartMsg_t));
-	 UartRecvQueue[2] = xQueueCreate(3, sizeof(UartMsg_t));
+	 create_ringBuffer(&uartRingBuffer[0],ringBufferforUart[0],sizeof(ringBufferforUart[0]));
+	 create_ringBuffer(&uartRingBuffer[1],ringBufferforUart[1],sizeof(ringBufferforUart[1]));
+	 create_ringBuffer(&uartRingBuffer[2],ringBufferforUart[2],sizeof(ringBufferforUart[2]));
+	 UartRecvQueue[0] = xQueueCreate(6, sizeof(uint32));
+	 UartRecvQueue[1] = xQueueCreate(6, sizeof(uint32));
+	 UartRecvQueue[2] = xQueueCreate(6, sizeof(uint32));
 	 UartSendQueue[0] = xQueueCreate(3, sizeof(UartMsg_t));
 	 UartSendQueue[1] = xQueueCreate(1, sizeof(UartMsg_t));
 	 UartSendQueue[2] = xQueueCreate(1, sizeof(UartMsg_t));
@@ -245,8 +240,8 @@ Std_ReturnType UART_Send_Data(uint8 transChannel, const uint8 *txBuffer, uint32
  }
  void Uart_Hal_RecvTask(void *pvParameters)
  {
-	 UartMsg_t UartMsg;
 	 UartHalMsg_t UartHalMsgRecv;
+	 uint16 recvSize = 0;
 	 BaseType_t ret = pdFALSE;
 	 BaseType_t ret_send = pdFALSE;
 	 uint32 T_bytesRemaining[3] = {0};
@@ -284,22 +279,11 @@ Std_ReturnType UART_Send_Data(uint8 transChannel, const uint8 *txBuffer, uint32
 			  {
 					if(UartHalMsgRecv.value>0)
 					{
-					UartMsg.DataLen = UartHalMsgRecv.value;
-					UartMsg.dataPrt = malloc(UartMsg.DataLen);
-					memset(UartMsg.dataPrt,0x00,UartMsg.DataLen);
-					memcpy(UartMsg.dataPrt,RX_Buffer[UartHalMsgRecv.Channel],UartMsg.DataLen);
-					ret_send = xQueueSend(UartRecvQueue[UartHalMsgRecv.Channel],&UartMsg,10);
-					if(ret_send==pdFALSE)
-					{
-						if(UartMsg.dataPrt!=NULL)
-						{
-							free(UartMsg.dataPrt);
-						}
-						UartMsg.dataPrt = NULL;
-					}
+						recvSize = write_ringBuffer(RX_Buffer[UartHalMsgRecv.Channel],UartHalMsgRecv.value,&uartRingBuffer[UartHalMsgRecv.Channel]);
+						ret_send = xQueueSend(UartRecvQueue[UartHalMsgRecv.Channel],recvSize,10);
 					}
 #if SEGGER_PRINTF==1
-	SEGGER_RTT_printf("[%d]ret_send=%d,ch=%d,%X\r\n",__LINE__,ret_send,UartHalMsgRecv.Channel,UartMsg.dataPrt);
+	SEGGER_RTT_printf("[%d]ret_send=%d,ch=%d-%d\r\n",__LINE__,ret_send,UartHalMsgRecv.Channel,recvSize);
 #endif
 					T_timeout[UartHalMsgRecv.Channel] = 0;
 					UartState[UartHalMsgRecv.Channel] = UartRecvComplete;
@@ -730,37 +714,21 @@ Std_ReturnType ADC_Converter(Adc_ValueGroupType *Buffer, TP_Value_Type *Converte
             ConvertedValueR[i] = (TP_Value_Type)((float)(10000 * (Buffer[i] - REFL) / (float)(REFH - REFL)) / (1 - (float)((Buffer[i] - REFL) / (float)(REFH - REFL))));
         }
     }
+    return 0;
 }
 
 Std_ReturnType ADC_ReadValue()
 {
     Std_ReturnType ret = E_NOT_OK;
-    Adc_ValueGroupType AdcReadGroupBuffer[NUM_RESULTS];
-    volatile Std_ReturnType Status = TRUE;
-    for (int i = 0; i < NUM_RESULTS; i++)
+    for (uint8 i = 0; i < NUM_RESULTS; i++)
     {
         ResultBuffer[i] = 0xFFFF;
-        AdcReadGroupBuffer[i] = 0xFFFE;
         ConvertedBuffer[i] = 0x00;
     }
     Adc_SetupResultBuffer(AdcGroupSoftwareOneShot, ResultBuffer);
     Adc_EnableGroupNotification(AdcGroupSoftwareOneShot);
     VarNotification_0 = 0;
     Adc_StartGroupConversion(AdcGroupSoftwareOneShot);
-    //	 uint32 TimeOut = 0;
-    //	 while(VarNotification_0 == 0 && VarNotification_1==0 && TimeOut<0xFFFF)
-    //	 {
-    //		 TimeOut++;
-    //	 }
-    //	 AdcStates = Adc_ReadGroup(AdcGroupSoftwareOneShot, AdcReadGroupBuffer);
-    //	 if(AdcStates == E_NOT_OK)
-    //	 {
-    //		 return AdcStates;
-    //	 }
-    //	 else
-    //	 {
-    //		 ret = E_OK;
-    //	 }
     return ret;
 }
 
@@ -773,7 +741,6 @@ static Std_ReturnType TestEep_FlexNvmProgramPartCmd(
     VAR(TestEep_Eeprom_FlexNvmPartitionType, AUTOMATIC) eepFlexNvmPartition)
 {
     Std_ReturnType u8RetVal = (Std_ReturnType)E_OK;
-    uint32 u32Addr = 0;
     uint32 u32FlexNvmPartSize = 0;
 
     uint32 u32RegSimFcfg1 = 0UL;

+ 3 - 3
src/hal_adapter.h

@@ -76,7 +76,7 @@ typedef signed long INT32;
 #define TJA1153_START_ID (uint32_t)(0x555u)
 #define TJA1153_CONFIG_ID (uint32_t)(0x18DA00F1u)
 #define NUM_RESULTS ADC_CFGSET_VS_0_GROUP_0_CHANNELS
-#define BUFFER_SIZE 1024
+#define BUFFER_SIZE 512
 #define DMA_SIZE 128
 
 typedef struct {
@@ -236,9 +236,9 @@ Std_ReturnType HAL_EEP_Write(uint32 eepWriteStartAddr, uint8 *pDataNeedtoWrite,
 Std_ReturnType HAL_EEP_Compare(uint32 eepCompareStartAddr, uint8 *pDataNeedtoCompare, uint32 dataSize);
 Std_ReturnType ADC_ReadValue(void);
 sint8 AtcmdDelayRecvFunc(uint8 recvChannel,char *ResultStrPtr,uint16 delayTime);
-Std_ReturnType UART_Query_Data(uint8 transChannel, uint8 recvChannel, const uint8 *txBuffer, uint32 sendLength, uint8 **rxBuffer, uint16 *rxlen, uint32 T_timeout);
+Std_ReturnType UART_Query_Data(uint8 transChannel, uint8 recvChannel, uint8 *txBuffer, uint16 sendLength, uint8 *rxBuffer, uint8 *rxlen, uint32 T_timeout);
 Std_ReturnType UART_Send_Data(uint8 transChannel, const uint8 *txBuffer, uint32 sendLength, uint32 T_timeout);
-Std_ReturnType UART_Receive_Data(uint8 recvChannel, uint8 **rxBuffer, uint16 *rxlen, sint32 T_timeout);
+Std_ReturnType UART_Receive_Data(uint8 recvChannel, uint8 *rxBuffer, uint8 *rxlen, uint32 T_timeout);
 void UART_Callback(uint32 hwInstance, Lpuart_Uart_Ip_EventType event);
 void UartInit(void);
 void SystemSoftwareReset(void);

+ 2 - 2
src/main.c

@@ -173,10 +173,10 @@ int main(void)
 #endif
 	UartInit();
 	xTaskCreate(MainTask, (const char *const)"MainTask", 512, (void *)0, main_TASK_PRIORITY + 3, NULL);
-	xTaskCreate(Uart0Task, (const char *const)"Uart0_Bms_Task", 1024, (void *)0, main_TASK_PRIORITY + 2, NULL);
+	xTaskCreate(Uart0Task, (const char *const)"Uart0_Bms_Task", 2048, (void *)0, main_TASK_PRIORITY + 2, NULL);
 //	xTaskCreate(CanTask, (const char *const)"CanTask", 512, (void *)0, main_TASK_PRIORITY + 2, NULL);
 	xTaskCreate(GpsTask, (const char *const)"GpsTask", 512, (void *)0, main_TASK_PRIORITY + 1, NULL);
-	xTaskCreate(Uart_4G_Task, (const char *const)"Uart_4G_Task", 2048, (void *)0, main_TASK_PRIORITY + 0, NULL);
+//	xTaskCreate(Uart_4G_Task, (const char *const)"Uart_4G_Task", 2048+1024, (void *)0, main_TASK_PRIORITY + 0, NULL);
 	vTaskStartScheduler();
 	for (;;)
 	{