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