码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-04-11 20:53:55      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:递归   协议   串口      数据重发   

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);	
		
	}
}
我推荐使用第二种方法,因为它简洁,好用。

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

标签:递归   协议   串口      数据重发   

原文地址:http://blog.csdn.net/hannibaychty/article/details/44998433

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!