单片机新框架修改

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

  

时间: 2024-10-13 16:51:02

单片机新框架修改的相关文章

Android4.3引入的UiAutomation新框架官方简介

译者序:Google在Android 4.3发布时提供了一套新的UiAutomation框架来支持用户界面自动化测试,该框架通过运用已有的Accessibility APIs来模拟用户跟设备用户界面的交互:比如获取窗口界面控件和注入事件等.如在4.3之前UiAutomator工具是通过InputManager或者更早的WindowManager来注入KeyEvent等,4.3之后用的就是新框架UiAutomation使用的Accessibility APIs来注入事件了. Class Overv

ReactiveCocoa - iOS开发的新框架

本文转载至 http://www.infoq.com/cn/articles/reactivecocoa-ios-new-develop-framework ReactiveCocoa(其简称为RAC)是由Github 开源的一个应用于iOS和OS X开发的新框架.RAC具有函数式编程和响应式编程的特性.它主要吸取了.Net的 Reactive Extensions的设计和实现.本文将详细介绍该框架试图解决什么问题,以及其用法与特点. ReactiveCocoa试图解决什么问题 经过一段时间的研

OpenWRT新框架的flash layout

唔,新框架下,同时支持了一个只读的文件系统(SquashFS)和一个可读写的文件系统(jffs2).所以,这些是怎么处理的,需要进一步了解. 关于flash 在大多数嵌入式系统中,flash是其主要的程序和data的存储空间.因为flash的速度原因,在系统运行时,这些程序和data还要再被搬移到RAM中去,运行时,CPU事实上是从RAM中取程序和data.著名的uboot就是专门负责把操作系统搬移到RAM中去的,至于存储在文件系统中的data和其他程序,则是由操作系统负责去加载. 根据其内部结

放弃OT了,找了个新框架ThinkCMF

放弃OT了,找了个新框架ThinkCMF,感觉还不错,用用看. 选择OT的原因: 1. OT基于ThinkPHP 2. OT对ThinkPHP进行了封装,使得开发应用更加简单 3. yershop应用是基于OT的 放弃的原因: 1. OT已经长时间没人维护了 2. OT提供的版本包问题太多,不适合使用. 接下来几天研究下ThinkCMF,希望有所进展.

OpenWRT新框架的boot过程

昨天在分析procd如何工作的时候,有找到过下面这样一段描述新架构boot过程的文字: 1) Bootloader (uboot, redboot, adam2, grub, …) 2) Linux kernel starts, tries to find the mtd partition called “rootfs”, mounts it 3) Linux executes /etc/preinit 4) Preinit waits a few seconds for failsafe t

[转] iOS --- ReactiveCocoa - iOS开发的新框架

转载唐巧的博客:ReactiveCocoa - iOS开发的新框架

新框架的选择

一个新框架的选择之路:     一.考虑前后端的交互方式的实现及兼容性,ajax的实现. 二.考虑UI框架的实用性 三.考虑开发.部署方式.这个很重要 四.易维护. 五.less.sass的支持. 软件的开发 一.前后端的设计登录信息的记录方式,交互方式 二.安全性 三.成本比较低,项目容易维护. 原文地址:https://www.cnblogs.com/yiyi17/p/8604377.html

iOS开发高级分享 - iOS 13 中的新框架 — MetriKit

MetriKit是iOS 13中用于收集和处理电池和性能指标的新框架.这是在WWDC今年与XCTestMetrics和Xcode Metrics组织者一起,作为一项协调一致的努力的一部分,为开发人员带来关于他们的应用程序在该领域的表现的新见解. 苹果会自动从AppStore上安装的应用程序中收集度量指标.您可以在Xcode 11中通过打开组织者(? ? ? o)并选择新的Metrics选项卡. MetriKit是Xcode组织者度量的补充,它提供了一种编程方式来接收有关应用程序在该领域中的表现的

新框架使用

等几年,再用新框架 在技??术领域,每个月都有一个新框架.例如,iOS 就有一个新的 UI 框架 SwiftUI. 我的建议是,等待几年再去学习它.不要担心会错过机会,这不是飞机航班,你仍然随时可以登机.任何时候,你都不应该因为害怕落后于潮流,而做出决定技术决定.如果你学习一个 UI 框架,它就应该对你的业务带来帮助,而不是为了学而学. 来自阮一峰日志摘录 文章来源:刘俊涛的博客 欢迎关注公众号.留言.评论,一起学习. ______________________________________