• 单片机新框架修改


    前阵子做的单片机项目要使用新框架,不允许使用状态机,真是哔了狗了,很多代码要改,最终确定的方案是收到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
    ",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);
    	}
    }
    

      

  • 相关阅读:
    SAP 用户权限解剖
    效率极低人群的七大习惯你占了几项? 迎客
    数据库到底用不用外键 迎客
    办公室生存——与人相处的30个原则 迎客
    虚拟机 VirtualBox 迎客
    fancybox 迎客
    遥志代理服务器软件CCProxy 迎客
    JRE和JDK的区别 迎客
    小众软件 迎客
    网络推广方法汇集 迎客
  • 原文地址:https://www.cnblogs.com/yinseyingji/p/7473209.html
Copyright © 2020-2023  润新知