OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2579|回复: 1

can接收问题

[复制链接]

9

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-7-15
在线时间
67 小时
发表于 2017-9-7 23:38:59 | 显示全部楼层 |阅读模式
5金钱
概述:已经搞了一个星期了,现在不知道如何下手了
一共3块板子,其中板子A、B给板子C发送数据,当不连接板子A/B时,C板子能正常接收B/A板子数据,当同时接A B板子时,C板子接收数据不正常,下面为代码:
A板子main.c代码
while(1)
        {
                Average();
                for(i=0;i<5;i++)
                {
                  pa1[i]=i+cnt;
                }
                for(i=0;i<5;i++)
                {
                  pa2[i]=i+10+cnt;
                }
                CAN1_Send_Msg(pa1,5,0x01);
                CAN1_Send_Msg(pa2,5,0x02);
               
                GPIO_ResetBits(GPIOA,GPIO_Pin_8);
                delay_ms(500);
                GPIO_SetBits(GPIOA,GPIO_Pin_8);
                delay_ms(500);
                cnt++;
                        if(cnt>10)
                                cnt=0;
        }

B板子main.c代码
while(1)
        {
                Average();
                for(i=0;i<5;i++)
                {
                  pa1[i]=i+cnt;
                }
                for(i=0;i<5;i++)
                {
                  pa2[i]=i+10+cnt;
                }
                CAN1_Send_Msg(pa1,5,0x03);
                CAN1_Send_Msg(pa2,5,0x04);
               
                GPIO_ResetBits(GPIOA,GPIO_Pin_8);
                delay_ms(500);
                GPIO_SetBits(GPIOA,GPIO_Pin_8);
                delay_ms(500);
                cnt++;
                        if(cnt>30)
                                cnt=20;
        }
       
}

can.c代码
u8 CAN1_Send_Msg(float* msg,u8 len,u16 ID)
{       
  u8 mbox;
  u16 i=0;
  CanTxMsg TxMessage;
  TxMessage.StdId=ID;          
  TxMessage.ExtId=0;          
  TxMessage.IDE=CAN_Id_Standard;                  
  TxMessage.RTR=0;                  
  TxMessage.DLC=len;                                                          
  for(i=0;i<len;i++)
  TxMessage.Data[i]=msg[i];                                           
  mbox= CAN_Transmit(CAN1, &TxMessage);   
  i=0;
  while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;        //等待发送结束
  if(i>=0XFFF)return 1;
  return 0;               
}

C板子can.c代码
u8 Can_Receive_Msg(float *buf1,float *buf2,float *buf3,float *buf4)
{                                     
        u32 i;
        CanRxMsg RxMessage;
    if( CAN_MessagePending(CAN1,CAN_FIFO1)==0)return 0;                //没有接收到数据,直接退出
    CAN_Receive(CAN1, CAN_FIFO1, &RxMessage);//读取数据       
        if(RxMessage.StdId==0x01)
        {
         for(i=0;i<5;i++)
    buf1[i]=RxMessage.Data[i];
                CAN_FIFORelease(CAN1, CAN_FIFO1);

        }
        CAN_Receive(CAN1, CAN_FIFO1, &RxMessage);
   if(RxMessage.StdId==0x02)
        {
         for(i=0;i<5;i++)
    buf2[i]=RxMessage.Data[i];
                CAN_FIFORelease(CAN1, CAN_FIFO1);

        }
  CAN_Receive(CAN1, CAN_FIFO1, &RxMessage);
  if(RxMessage.StdId==0x03)
        {
         for(i=0;i<5;i++)
    buf3[i]=RxMessage.Data[i];
                CAN_FIFORelease(CAN1, CAN_FIFO1);

        }

  CAN_Receive(CAN1, CAN_FIFO1, &RxMessage);
  if(RxMessage.StdId==0x04)
        {
         for(i=0;i<5;i++)
    buf4[i]=RxMessage.Data[i];
                CAN_FIFORelease(CAN1, CAN_FIFO1);

        }
        return RxMessage.DLC;       
               
}

C板子main.c代码
while(1)
        {
               
                Can_Receive_Msg(PA11,PA12,PA21,PA22);       
                for(i=0;i<5;i++)
                {
                 sprintf(str,"%.2f",PA11[i] );
                 LcdPrintString(192,35*i+50,0x02,0xf1f0,0x0800,"     ");
                 LcdPrintString(192,35*i+50,0x02,0xf1f0,0x0800,str);
                 
                 sprintf(str,"%.2f",PA12[i] );
                 LcdPrintString(192*2,35*i+50,0x02,0xf1f0,0x0800,"     ");
                 LcdPrintString(192*2,35*i+50,0x02,0xf1f0,0x0800,str);
                }       
                for(i=0;i<5;i++)
                {
                  sprintf(str,"%.2f",PA21[i] );
                 LcdPrintString(0,35*i+50,0x02,0xf1f0,0x0800,"     ");
                 LcdPrintString(0,35*i+50,0x02,0xf1f0,0x0800,str);
                 
                 sprintf(str,"%.2f",PA22[i] );
                 LcdPrintString(100,35*i+50,0x02,0xf1f0,0x0800,"     ");
                 LcdPrintString(100,35*i+50,0x02,0xf1f0,0x0800,str);
                }
       
                GPIO_ResetBits(GPIOB,GPIO_Pin_5);
                delay_ms(500);
                GPIO_SetBits(GPIOB,GPIO_Pin_5);
                delay_ms(500);
        }


请教高手,这是什么原因

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

63

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1136
金钱
1136
注册时间
2015-11-29
在线时间
146 小时
发表于 2017-9-8 09:00:54 | 显示全部楼层
C板的接收用中断,你把接收放在主程序里面循环调用C板子main.c代码下面延时可能导致数据掉包
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 08:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表