今天遇到了一个问题:
UDP_Class::UDP_Class(Can_Class * Can_point)
{
//Can_point = Can_point; 错误
//形参不能和类的成员同名,
this->Can_tem_point=Can_point;
}
看上面的UDP_Classl类,我之前定义了一个类的私有成员Can__point,注释部分
private:
Action_Class *Action_Obj_tmp;
Can_Class * Can_tem_point;
//Can_Class * Can__point;
然后在构造函数的时候把一个对象的指针赋值到成员。注释部分
然后在UDP的类函数里调用了Can__point对象的函数。
//Can_tem_point原本是Can__point
case 172:
//需要等待slave电机回传OK
if(Can_tem_point->Can_Sendcmd_Data(142,&udp_ReceBuf(0))==0)
{
udp_SendCommOK(0x55);
}
break;
再往里走
u8 Can_Class::Can_Sendcmd_Data(u8 miancmd,u8 * udpdata)
{
static DWORD Can_Wait_Sendback_OK=0;
u8 status;
u8 i;
u8 buf[8]={0,1,2,3,4,5,6,7};
buf[0] = 142;//142
buf[1] = udpdata[6];//11
buf[2] = udpdata[7];//地址低位
buf[3] = udpdata[8];//地址高位
buf[4] = udpdata[11];//数据低位
buf[5] = udpdata[12];//数据高位
buf[6] = udpdata[9];//数据个数低位
buf[7] = (udpdata[9]>>8)&0xff;//数据个数高位
if(Can1_APP.CAN_Send_Msg_M4(buf,FDCAN_DLC_BYTES_8)==1)
{
status =1;
}
else
{
//等待完成
Can_Wait_Sendback_OK = lwTickCount_M4;
//等待CPU1修改完成才发送
while(1)
{
//如果在10ms内更新完成就没事
if((CanBus_RecvBuf[5]!=0x55)&&(lwTickCount_M4<(Can_Wait_Sendback_OK+1000)))
{
// for(i=0;i<8;i++)
// printf("%x ",(CanBus_RecvBuf[i]));
// printf("\r\n");
IWDG_Feed_M4();
}
//如果在10ms内更新完成就没事
else if((CanBus_RecvBuf[5]==0x55)&&(lwTickCount_M4<(Can_Wait_Sendback_OK+1000)))
{
// printf("44\r\n");
status= 0;
break;
}
else if((CanBus_RecvBuf[5]!=0x55)&&(lwTickCount_M4>(Can_Wait_Sendback_OK+1000)))
{
//printf("%d\r\n",(CanBus_RecvBuf[5]));
//printf("5\r\n");
status= 1;
CanBus_Alarm=1;
break;
}
}
}
return status;
}
这里,是用网络给下位机发指令,然后下位机1又往另一个下位机2发送CAN指令,接着等待返回OK的信号。
这时候奇怪的现象出现了,
另一个下位机2是成功返回了OK信号,下位机1也收到了OK信号,为什么呢,看下面。
extern "C"void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
u8 i=0;
//printf("1\r\n");
//RxFifo0ITs是一个中断的标志位,表示是什么中断,FDCAN 中断寄存器 (FDCAN_IR)
if((RxFifo0ITs&FDCAN_IT_RX_FIFO0_NEW_MESSAGE)!=RESET) //FIFO1新数据中断
{
//提取FIFO0中接收到的数据
HAL_FDCAN_GetRxMessage(hfdcan,FDCAN_RX_FIFO0,&FDCAN1_RxHeader,Can1_APP.CanBus_RecvBuf);
//RXF0C.F0SA、RXF1C.F1SA 和 RXBC.RBSA,看手册
Can1_APP.Client_Id = FDCAN1_RxHeader.Identifier;
Can1_APP.CanBus_Recv_Len = FDCAN1_RxHeader.DataLength>>16;
HAL_FDCAN_ActivateNotification(hfdcan,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);
if(Can1_APP.Client_Id == Can_Recv_Client_ID)
{
// printf("%d\r\n",Can1_APP.CanBus_Recv_Len);
//
// printf("%x\r\n",Can1_APP.CanBus_RecvBuf[5]);
Can1_APP.Can_Recv_Flag =1;
}
}
}
我在这个回调函数里打印了数据,确实收到了我想要的数据Can1_APP.CanBus_RecvBuf[5]=0x55.
可是,就是进不了下面这个if
else if((CanBus_RecvBuf[5]==0x55)&&(lwTickCount_M4<(Can_Wait_Sendback_OK+1000)))
{
// printf("44\r\n");
status= 0;
break;
}
我在这个if打印数据,发现全是一堆毫无关系的数据,都不是另一个下位机2发回来的数据
if((CanBus_RecvBuf[5]!=0x55)&&(lwTickCount_M4<(Can_Wait_Sendback_OK+5)))
{
// for(i=0;i<8;i++)
// printf("%x ",(CanBus_RecvBuf[i]));
// printf("\r\n");
IWDG_Feed_M4();
}
这时候就奇怪了。我的回调函数里明明收到了数据,而且,这是一个while循环,是不会出去的,但是我在等待期间打印收到的数据确实一堆毫无关系的数据。
后来我把下位机1的程序下载到下位机2,然后就正常了,唯一的不同是,Can_tem_point=Can_point;
这两个不同名。
为什么我会写成不同名,那也是巧合,改回来了。然后都不知道找问题找到什么时候。
UDP_Class::UDP_Class(Can_Class * Can_point)
{
//Can_point = Can_point; 错误
//形参不能和类的成员同名,
this->Can_tem_point=Can_point;
}
可是。我又想不懂为什么,这是什么原理,
用同名的指针对象函数是可以执行的,就是在里面的while等待的时候CanBus_RecvBuf的数据会出错。