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

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

可以以心感悟,以此沉淀,足矣;耳听佳音,目极美好,

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

相关文章:

你感兴趣的文章:

标签云: