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

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汉尼拔勇闯天涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值