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