1. 程式人生 > >單片機新框架修改

單片機新框架修改

框架 優化 art mov har pre 主程 查詢 read

前陣子做的單片機項目要使用新框架,不允許使用狀態機,真是嗶了狗了,很多代碼要改,最終確定的方案是收到256後,找頭找尾,有就處理,沒有就往前移128,再讀128個字符出來,相較之前的狀態機處理效率,顯然會下降,但是領導要求如此,那也沒轍,同時也優化了數據處理的相關流程,學會了使用memmove,新的機制是,串口接收超時或者接收緩沖區半滿或者全滿時會置位,主程序中不斷查詢這個位。

串口1與GPS通信的代碼改為如下

void UART1_DATA_PROC(void)
{
    char    *pS=NULL,*pE=NULL;
    int count = 0;
    uint32_t gUart1RxLen 
= 0; uint8_t gUart1PrBuf[RX_MAXSIZE] = {0}; uint32_t HALF_RXLEN = UART1_RXBUF_LEN /2; // printf("g g= %d %d\n",gUart1ReadInd,gUart1RxIndex); if(gUart1ReadInd != HALF_RXLEN && gUart1ReadInd != 0) return; if(gUart1RecvInd > gUart1ReadInd) { gUart1RxLen = HALF_RXLEN; memcpy(gUart1PrBuf,gUart1RxBuf
+ gUart1RxLen,gUart1RxLen); gUart1RecvInd = 0; } else if(gUart1RecvInd == gUart1ReadInd) return; else { gUart1RxLen = HALF_RXLEN; memcpy(gUart1PrBuf,gUart1RxBuf,gUart1RxLen); gUart1RecvInd = gUart1RxLen; } memmove(Uart1RxBuf,Uart1RxBuf
+HALF_RXLEN,HALF_RXLEN); memcpy(Uart1RxBuf+HALF_RXLEN,gUart1PrBuf,HALF_RXLEN); if(FirstTime == 0) { FirstTime = 1; return; } memset(Uart1ProcBuff,0,RX_MAXSIZE); pS = (char *)strstr(Uart1RxBuf,CMD_RMC); pE = (char *)strstr(pS,END_FLAG); if(pS != NULL && pE != NULL) { count = pE-pS; if(count > GPS_MAXLENTH) return; memcpy(Uart1ProcBuff,pS,count); GpsDateType = RMC; if(count < GPS_MINLENTH) GpsDateType = NOUSE; GPS_DATA_PROC(); } memset(Uart1ProcBuff,0,RX_MAXSIZE); pS = (char *)strstr(Uart1RxBuf,CMD_GGA); pE = (char *)strstr(pS,END_FLAG); if(pS != NULL && pE != NULL) { count = pE-pS; if(count > GPS_MAXLENTH) return; memcpy(Uart1ProcBuff,pS,count); GpsDateType = GGA; if(count < GPS_MINLENTH) GpsDateType = NOUSE; GPS_DATA_PROC(); } }

串口0與上位機通信代碼改為如下

void UART0_DATA_PROC()
{
	uint8_t ret = 0;
	uint8_t len = 0;
	uint32_t tUart0RxLen = 0;
	PM5K_PCM_DEV_PP_YDT1363_3 YdtBuf;
	if(gUart0RecvInd > gUart0ReadInd)
	{
		tUart0RxLen = UART0_RXBUF_LEN - gUart0RecvInd;
		memcpy(gUart0PrBuf,gUart0RxBuf + gUart0RecvInd,tUart0RxLen);
		gUart0RxLen += tUart0RxLen;
		gUart0RecvInd = gUart0ReadInd;
		if(gUart0RxLen < RCV_LENTH)
		return;	
	}
	else if(gUart0RecvInd == gUart0ReadInd)
		return;
	else
	{
		tUart0RxLen = gUart0ReadInd - gUart0RecvInd;
		if(gUart0RxLen > 0)
			memcpy(gUart0PrBuf+gUart0RxLen,gUart0RxBuf + gUart0RecvInd,tUart0RxLen);
		else
			memcpy(gUart0PrBuf,gUart0RxBuf + gUart0RecvInd,tUart0RxLen);
		gUart0RxLen += tUart0RxLen;
		gUart0RecvInd = gUart0ReadInd;
			if(gUart0RxLen != RCV_LENTH)
			{
				if(gUart0RxLen < RCV_LENTH)
				{
					if(gUart0RecvInd == UART0_RXBUF_LEN/2)
						return;
				}
				else
				{
					gUart0RxLen = 0;
					memset(gUart0PrBuf,0,20);
					return;
				}
			}			
	}	
	len = (uint8_t)gUart0RxLen;
	gUart0RxLen = 0;
	ret = ProtocolProc_YDT(TRUE,&YdtBuf, gUart0PrBuf, &len);
	memset(gUart0PrBuf,0,20);
	if(ret)
	{
		PopCmdQueue(ret);
	}
}

  

單片機新框架修改