项目难题之编程实现数据不对重发的机制

ARM接收PC机通过串口发来的数据,数据打包成帧的形式,有针头针尾,我要实现的功能是:ARM通过检验帧头针尾是否正确,决定是否请求PC机重新发送上一帧的数据。

我们知道汇编中有调到特定位置的程序的功能,但是C语言中没有,它太多有一个goto,但是goto会出问题,造成死循环,不建议使用。这里我通过两种方式实现上述功能,这两种方式都是通过实际验证的,绝对可行。

1、在main程序的while中添加标志位,告诉ARM是否需要重新发送数据,具体代码如下:

int main()
{
    ............(各种初始化程序)
    bool flag=false;   //用于实现数据重发的机制
    unsigned int CtrlFlag[6];   //存储来自PC机的数据
    while(1)
    {	

	uartGet(CtrlFlag,0);
	if(CtrlFlag[0]==0xFF && CtrlFlag[5]==0xEE)   //帧头帧尾正确
	{
	   flag=false;
           .......(具体的数据处理程序)
        }
	else  //接收PC数据有误,要求重发
       {
	    flag=true;

        }
	if(flag==true)
	   uartSend(RETRANSMIT,0);//串口重发

    }
}

2、在子函数中使用递归调用:

/*********uart.cpp************/
.....................
/*******串口协议接收数据***********
*function:UartProtol
*input: whichUart:串口号
*output:转化好的10进制数据
*********************************/
float *UartProtol(int whichUart)
{
	unsigned int init_HexData=0;
	unsigned int *HexData=&init_HexData;       //存放接收到的16进制数(2位为一组数)
	static float tmp_DecData[6]={0,0,0,0,0,0};    //此处一定要加static,不能返回局部变量地址
        float *DecData=tmp_DecData;     

	uartGet(HexData,whichUart);
	if(HexData[0]==0xff && HexData[5]==0xee)  //帧头帧尾正确
	{
	   .......(具体处理程序)
	   return 	  DecData;
	}
	else   //重发数据的命令在主函数中也有
	{
	    unsigned int  ReTransmit[6]= {0xff,0x22,0xff,0xff,0xff,0xee};   //数据重发命令
	    uartSend(ReTransmit,0);

	    return UartProtol(0);    //递归调用
	}

}
...................
/*****main.c*****/
#include "uart.cpp"
int main()
{
    while(1)
    {
	//test递归调用实现数据重发
	float ch[6]={0,0,0,0,0,0};
	float *chpt=ch;
	chpt=UartProtol(0);
	int iii=(int)(*chpt);
	uartSendHex(iii,0);	

	}
}

我推荐使用第二种方法,因为它简洁,好用。

时间: 2024-10-13 08:56:13

项目难题之编程实现数据不对重发的机制的相关文章

如何用ABP框架快速完成项目(面向工资编程面向客户编程篇) - 广州.net微软技术俱乐部12月份活动报名帖

这是广州.net微软技术俱乐部12月份活动报名帖.此帖会持续更新. 活动课程标题是:如何用ABP框架快速完成项目(面向工资编程面向客户编程篇) 这是内容大纲: ABP框架简介(这里会聊聊.net真的不如JAVA吗?) 快的定义! 用ABP一个人快速完成项目(含实操演练) 用ABP只要加人即可马上加快项目进展(一) - 全栈篇 用ABP只要加人即可马上加快项目进展(二) - 分工篇 用ABP遇到难题项目受阻时如何避免项目延迟 介绍副讲师和未来一年广州.net俱乐部发展讨论. 时间暂定为12月份的某

【项目积累】对JSON数据的处理

[项目简述]     接触.NET项目非常长一段时间了,前台用的都是MVC框架.不知道大家是否想过一个问题.我们是怎样将数据显示到前台的,换句话说,MVC能够识别怎么样的数据形式?答案非常easy,就是JSON数据.不太记得的,最好还是找段代码看看.我们须要将数据显示到前台.一定会返回JSON类型的数据. [博客概要] 眼下为止,JSON的应用我们都不陌生了. 但对于JSON的一些理论知识,你真正知道吗?或者说,你在项目调试的时候.以前有在前台alert过一个JSON串吗?有看过JSON串的内容

beej's 网络编程 打包数据pack data

7.4. Serialization—How to Pack Data It's easy enough to send text data across the network, you're finding, but what happens if you want to send some "binary" data like ints or floats? It turns out you have a few options. Convert the number into

Spring:启动项目时加载数据库数据(总结)

在项目中需要启动程序时,要将数据库的用户信息表加载到内存中,找到一下几种方式. 1.实现ApplicationListener接口,重写onApplicationEvent方法,可以在项目启动的时候执行该方法. @Component("userInit") public class UserInit implements ApplicationListener { public static Map<String,User> map=new HashMap<Strin

android-async-http开源项目对服务器端返回JSON数据的处理

一.在JavaEE项目中搭建环境 1. 导入相关jar包 2. 搭建相关的包和类 3.类中的方法简单实现 User: 声明以下属性,并实现无参构造器和有参构造器,以及各自的get和set方法 UserDao: UserDaoImpl: JsonServlet: <span style="white-space:pre"> </span>protected void doGet(HttpServletRequest request, HttpServletResp

js面向对象编程:数据的缓存

js也可以通过缓存数据,来加快处理速度.在必要的时候使用空间还换取时间还是值得的.例如需要很长时间才能完成的计算,就可以把计算结果缓存到客户端,以后就可以直接使用缓存的计算结果,不在重复计算. 1简单函数的计算结果的缓存 2递归函数的计算结果的缓存  3Ajax读取数据的缓存 1简单函数的计算结果的缓存 例如: //共用函数,封装内部调用,缓存计算结果 function memorize(f) { var cache={}; return function(){ var key=argument

Django项目与mysql交互进行数据迁移时报错:AttributeError: &#39;str&#39; object has no attribute &#39;decode&#39;

问题描述 Django项目启动,当我们执行命令 python manage.py makemigrations 出现如下错误: File "/usr/local/lib/python3.6/dist-packages/django/db/backends/mysql/operations.py", line 147, in last_executed_query query = query.decode(errors='replace') AttributeError: 'str' o

总结如何复用个人项目实现结对编程项目,以及结对编程的经验、教训。

复用个人项目实现结对编程时,首先分析谁的代码实现功能更好,复用性更好,这时候调用函数的重要性就体现出来了.在复用时可以直接复制整个函数加到项目中. 分工上,我负责功能界面的实现,队友负责新增功能的实现.在界面代码的编写上,有很多固定的套路,比如声明,设置位置等等.这时候继承组件,并在参数设置上直接给好要放置的位置等等.这样做在小项目上重要性体现不大,而一旦项目代码量上来后,甚至只到这次结对编程的小工作量,已经可以节省很大一部分的工作量. 避免写出几百几百行的代码,应将具体功能分成一个个小功能,这

前后端分离——前端项目使用Mock.js 模拟数据

一.简单介绍一下Mock.js 众所周知Mock.js因为两个重要的特性风靡前端: 数据类型丰富支持生成随机的文本.数字.布尔值.日期.邮箱.链接.图片.颜色等.(详情见官网) 拦截 Ajax 请求不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响应数据.安全又便捷 文章会用到的API(也是Mock经常使用的API): Mock.mock(url, type, data) 参数名 参数需求 参数描述 例子 url 可选: URL 字符串或 URL 正则 拦截请求的地址 /mock ty