今天遇到了一个问题:
UDP_Class::UDP_Class(Can_Class * Can_point)
{
this->Can_tem_point=Can_point;
}
看上面的UDP_Classl类,我之前定义了一个类的私有成员Can__point,注释部分
private:
Action_Class *Action_Obj_tmp;
Can_Class * Can_tem_point;
然后在构造函数的时候把一个对象的指针赋值到成员。注释部分
然后在UDP的类函数里调用了Can__point对象的函数。 //Can_tem_point原本是Can__point
case 172:
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;
buf[1] = udpdata[6];
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;
while(1)
{
if((CanBus_RecvBuf[5]!=0x55)&&(lwTickCount_M4<(Can_Wait_Sendback_OK+1000)))
{
IWDG_Feed_M4();
}
else if((CanBus_RecvBuf[5]==0x55)&&(lwTickCount_M4<(Can_Wait_Sendback_OK+1000)))
{
status= 0;
break;
}
else if((CanBus_RecvBuf[5]!=0x55)&&(lwTickCount_M4>(Can_Wait_Sendback_OK+1000)))
{
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;
if((RxFifo0ITs&FDCAN_IT_RX_FIFO0_NEW_MESSAGE)!=RESET)
{
HAL_FDCAN_GetRxMessage(hfdcan,FDCAN_RX_FIFO0,&FDCAN1_RxHeader,Can1_APP.CanBus_RecvBuf);
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)
{
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)))
{
status= 0;
break;
}
我在这个if打印数据,发现全是一堆毫无关系的数据,都不是另一个下位机2发回来的数据
if((CanBus_RecvBuf[5]!=0x55)&&(lwTickCount_M4<(Can_Wait_Sendback_OK+5)))
{
IWDG_Feed_M4();
}
这时候就奇怪了。我的回调函数里明明收到了数据,而且,这是一个while循环,是不会出去的,但是我在等待期间打印收到的数据确实一堆毫无关系的数据。
后来我把下位机1的程序下载到下位机2,然后就正常了,唯一的不同是,Can_tem_point=Can_point; 这两个不同名。 为什么我会写成不同名,那也是巧合,改回来了。然后都不知道找问题找到什么时候。
UDP_Class::UDP_Class(Can_Class * Can_point)
{
this->Can_tem_point=Can_point;
}
可是。我又想不懂为什么,这是什么原理, 用同名的指针对象函数是可以执行的,就是在里面的while等待的时候CanBus_RecvBuf的数据会出错。
|