CAN接收大量数据出现丢失整帧数据的情况
丢失一帧是什么意思,你想接收数据的这个节点少收到了一帧?确定其他的8个节点都正确发送出去了吗?
总线上有9个节点,8个节点只能接收对应ID的数据,1个节点接收总线上其他8个节点发送的数据(假设为节点A)。当A向其他8个节点发数据时,自己还的去接收其他节点发出的数据。
通过监测,A发的向8个节点发的数据已经发出去了(对应标号为1888-1895),8个节点收到数据会向总线发送数据。而A节点接收总线上的数据。监测到8个节电的数据只收到7个节点的。不能确定8个节点是否都将数据正确发送出去。
通过can工具,单独向8个节点发送大量数据,监测显示数据都可以正常接收和发送。
有CAN工具的话,trace下总线上的数据,根据CAN ID来确定是哪个节点没有正确发送。或者用示波器(能解析CAN帧的示波器)把这些帧抓住,也能分析出来CAN ID,顺便看下ACK位用没有响应。
通过软件仿真和CAN工具都是可以看出是哪个节点丢失数据的。而且我在发送端仿真时,显示数据是发出去了,但总线上和接收端都没看到。发送端发送的是自己节点的ID,接收端接收任意ID的数据。
发送节点是否发送成功,正在验证中。
接收和发送程序为:
发送:
u8 CAN2_Send_Msg(u8 id,u8* msg,u8 len)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=id; // ±ê×?±êê?·??a0
// TxMessage.ExtId=0x12; // éè??à??1±êê?·?£¨29??£?
TxMessage.IDE=0; // ê1ó?±ê×?±êê?·?
TxMessage.RTR=0; // ???¢ààDí?aêy?Y??£?ò???8??
TxMessage.DLC=len;
for(i=0;i<len;i++)
TxMessage.Data[i]=msg[i];
mbox= CAN_Transmit(CAN2, &TxMessage);
i=0;
while((CAN_TransmitStatus(CAN2, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))
i++; //μè′y·¢?í?áê?
if(i>=0XFFF)return 1;
return 0;
}
接收
void CAN2_RX0_IRQHandler(void)
{
OS_ERR err;
CanRxMsg RxMessage;
int i=0,j;
CAN2_Recev_busy_flag=1;
#if SYSTEM_SUPPORT_OS //ê1ó?UCOS2ù×÷?μí3
OSIntEnter();
#endif
CAN_Receive(CAN2, 0, &RxMessage);
++CAN2_Recev_counter;
Can2Frame_num++;
for(i=0;i<RxMessage.DLC;i++)
{
receive_buf[receive_counter_buf]=RxMessage.Data[i];
receive_counter_buf++;
if(RxMessage.Data[i]=='}'&&RxMessage.Data[i-1]==0x0D)
{
if(receive_counter_buf==16||receive_counter_buf==8)
{
Receive_buf[receive_cir]=RxMessage.StdId;
receive_cir++;
for(j=0;j<receive_counter_buf;j++)
{
Receive_buf[receive_cir]=receive_buf[j];
receive_cir++;
}
Cmd_numb++;
CAN2_Recev_data_counter=CAN2_Recev_data_counter+1;
}
receive_counter_buf=0;
}
}
CAN_FIFORelease(CAN2, 0);
// CAN_ClearITPendingBit(CAN2, CAN_IT_FMP0);
#if SYSTEM_SUPPORT_OS
OSIntExit(); //í?3??D??
#endif
CAN2_Recev_busy_flag=0;
}
估计接收程序没处理好,但是又没想到更好的接收处理方式