微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > CAN接收大量数据出现丢失整帧数据的情况

CAN接收大量数据出现丢失整帧数据的情况

时间:10-02 整理:3721RD 点击:
CAN总线上9个节点,8个节点向某一节点发送一帧数据(有时会出现同时发送的情况),偶尔会出现丢失一帧数据的情况。500k的波特率。总线两端也接了120欧的匹配电阻。


丢失一帧是什么意思,你想接收数据的这个节点少收到了一帧?确定其他的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;
}
估计接收程序没处理好,但是又没想到更好的接收处理方式

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top