找回密码
 立即注册
查看: 615|回复: 4

数据缩在一起再分开,是为啥

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:77
  • 最近打卡:2025-04-15 13:59:49

17

主题

61

回帖

575

积分

高级会员

积分
575
发表于 2024-3-15 16:43:58 | 显示全部楼层 |阅读模式




截图202403151642027851.jpg

如上,过一会就好了,
产品现象,就是反应有点慢,按理应该跟上面,074同时变化的
u8 rx_old;



        //====初始化数据=====
        CAN1_Tx.FF = STANDARD_FRAME;    //标准帧
        CAN1_Tx.RTR = 0;                //0:数据帧,1:远程帧
        CAN1_Tx.DLC = 0x08;             //数据长度
        CAN1_Tx.ID = 0x21A;            //CAN ID
        CAN1_Tx.DataBuffer[0] = 0x20;   //数据内容
        CAN1_Tx.DataBuffer[1] = 0x00;
        CAN1_Tx.DataBuffer[2] = 0x00;
        CAN1_Tx.DataBuffer[3] = 0x00;
        CAN1_Tx.DataBuffer[4] = 0x00;
        CAN1_Tx.DataBuffer[5] = 0x00;
        CAN1_Tx.DataBuffer[6] = 0x00;
        CAN1_Tx.DataBuffer[7] = 0x00;

/*       
        CAN2_Tx.FF = EXTENDED_FRAME;    //扩展帧
        CAN2_Tx.RTR = 0;                //0:数据帧,1:远程帧
        CAN2_Tx.DLC = 0x08;             //数据长度
        CAN2_Tx.ID = 0x03456789;        //CAN ID
        CAN2_Tx.DataBuffer[0] = 0x21;   //数据内容
        CAN2_Tx.DataBuffer[1] = 0x22;
        CAN2_Tx.DataBuffer[2] = 0x23;
        CAN2_Tx.DataBuffer[3] = 0x24;
        CAN2_Tx.DataBuffer[4] = 0x25;
        CAN2_Tx.DataBuffer[5] = 0x26;
        CAN2_Tx.DataBuffer[6] = 0x27;
        CAN2_Tx.DataBuffer[7] = 0x28;
*/
    B_Can1Send = 0;
    B_Can2Send = 0;
    while(1)
    {
        if(B_1ms)   //1ms到
        {
            B_1ms = 0;
            KeyResetScan();   //P3.2口按键触发软件复位,进入USB下载模式,不需要此功能可删除本行代码

                        if(B_Can1Read)
                {
                    B_Can1Read = 0;
                   
                    CANSEL = 0;         //选择CAN1模块
                               
                    n = CanReadMsg(CAN1_Rx);    //读取接收内容
                                                                   
                    if(n>0)
                    {
                        for(i=0;i<n;i++)
                        {
        //                    CanSendMsg(&CAN1_Rx);  //CAN总线原样返回

                                                if (CAN1_Rx.ID == 0X74)
                                                        {
                                                        if(CAN1_Rx.DataBuffer[0] != rx_old)
                                                                {
                                                                        rx_old = CAN1_Rx.DataBuffer[0];
                                                                        CAN1_Tx.DataBuffer[0] = (CAN1_Rx.DataBuffer[0] )&0xF0;
                                                                }
                                                        }
                                               
                            printf("CAN1_rx From 产品 :ID=0x%03lX DLC=%d FF=%d RTR=%d ",CAN1_Rx.ID,CAN1_Rx.DLC,CAN1_Rx.FF,CAN1_Rx.RTR);   //串口打印帧信息
                            for(j=0;j<CAN1_Rx.DLC;j++)
                            {
                                printf("0x%02X ",CAN1_Rx.DataBuffer[j]);    //从串口输出收到的数据
                            }
                            printf("\r\n");
                        }
                    }
                }


                       
            if(++msecond >= 100)   //1秒到
            {
                msecond = 0;

                //------------------处理CAN1模块-----------------------
                CANSEL = 0;         //选择CAN1模块
                sr = CanReadReg(SR);

                if(sr & 0x01)                //判断是否有 BS:BUS-OFF状态
                {
                    CANAR = MR;
                    CANDR &= ~0x04;  //清除 Reset Mode, 从BUS-OFF状态退出
                }
                else
                {
                    CanSendMsg(&CAN1_Tx);   //发送一帧数据
                }
/*
                //------------------处理CAN2模块-----------------------
                CANSEL = 1;         //选择CAN2模块
                sr = CanReadReg(SR);

                if(sr & 0x01)                //判断是否有 BS:BUS-OFF状态
                {
                    CANAR = MR;
                    CANDR &= ~0x04;  //清除 Reset Mode, 从BUS-OFF状态退出
                }
                else
                {
                    CanSendMsg(&CAN2_Tx);   //发送一帧数据
                }*/
            }
        
     }
        
       
        if(B_Can2Read)
                {
                    B_Can2Read = 0;
                   
                    CANSEL = 1;         //选择CAN2模块
                    n = CanReadMsg(CAN2_Rx);    //读取接收内容
                    if(n>0)
                    {
                        for(i=0;i<n;i++)
                        {
        //                    CanSendMsg(&CAN2_Rx);  //CAN总线原样返回
       
                            printf("CAN2_rx From CAN1_tx:ID=0x%03lX DLC=%d FF=%d RTR=%d ",CAN2_Rx.ID,CAN2_Rx.DLC,CAN2_Rx.FF,CAN2_Rx.RTR);   //串口打印帧信息
                            for(j=0;j<CAN2_Rx.DLC;j++)
                            {
                                printf("0x%02X ",CAN2_Rx.DataBuffer[j]);    //从串口输出收到的数据
                            }
                            printf("\r\n");
                        }
                    }
                }
        

        if (bUsbOutReady) //USB调试及复位所需代码
        {
            usb_OUT_done();
        }
    }
}


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:326
  • 最近打卡:2025-05-07 10:51:09
已绑定手机

21

主题

487

回帖

1059

积分

金牌会员

积分
1059
发表于 2024-3-19 12:31:48 | 显示全部楼层
没看明白,这是在网页上进行测试吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:77
  • 最近打卡:2025-04-15 13:59:49

17

主题

61

回帖

575

积分

高级会员

积分
575
发表于 2024-3-19 13:22:35 | 显示全部楼层
lly*** 发表于 2024-3-19 12:31
没看明白,这是在网页上进行测试吗?

不是网页,是CAN分析仪CANalyst-II界面


其实动作很简单

就是 A: ID 0XAA 根据四个不同动作 发送 : 11 ,22 ,33 , 44
然后 B:  ID  0XBB 根据收到的四个不同动作 返回:  10 ,20, 30 ,40  ,
接着:0XAA  会根据 返回的:  10 ,20, 30 ,40   ,点亮不同的灯

现在就是: A产品  0XAA 根据四个不同动作 发送 : 11 ,22 ,33 , 44 很迅速  

                 B产品 0XBB 根据收到的四个不同动作 返回:  10 ,20, 30 ,40 的过程会有反应慢的现象,具体就是会在返回过程中,数据显示缩在一起。
                 导致点亮不同的灯 也会滞后于动作 。
                    等数据显示分开正常了,灯才正常点亮。

截图202403191317099728.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:326
  • 最近打卡:2025-05-07 10:51:09
已绑定手机

21

主题

487

回帖

1059

积分

金牌会员

积分
1059
发表于 2024-3-19 17:36:53 | 显示全部楼层
我也是使用的CAN分析仪进行的CAN测试,感觉CAN数据很稳定,没有出现过你这种情况,第一 STC测试板和CAN分析仪的通信速率是否完全一样?第二B产品收到数据执行动作后返回数据慢,是否执行的动作占用了中断?按理说CAN数据是一次性发送一帧的,不应该会出现压缩的情况
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:77
  • 最近打卡:2025-04-15 13:59:49

17

主题

61

回帖

575

积分

高级会员

积分
575
发表于 2024-3-20 16:12:11 | 显示全部楼层
本帖最后由 QW123 于 2024-3-20 16:13 编辑
lly*** 发表于 2024-3-19 17:36
我也是使用的CAN分析仪进行的CAN测试,感觉CAN数据很稳定,没有出现过你这种情况,第一 STC测试板和CAN分析 ...

截图202403201038428244.jpg

大概是因为这个
要改成这样,

if(n>0)
{
for(i=0;i<n;i++)
{


if (CAN1_Rx(i).ID == 0X74)
{                                                        
  if(CAN1_Rx(i).DataBuffer[0] != rx_old)

  {
     rx_old = CAN1_Rx(i).DataBuffer[0];
     CAN1_Tx.DataBuffer[0] = (CAN1_Rx(i).DataBuffer[0] )&0xF0;
  }
}


推测如果没有, 又有由于缓存区那边是8帧空间,程序前置是  在 N 帧数里 进行 for 判断

所以,if (CAN1_Rx.ID == 0X74) 是对第一帧满足时,if(CAN1_Rx.DataBuffer[0]  )又对第一帧第一个数据进行判断
这么一来,如果不是第一帧,第一个数据,就会掠过,等待整个for缓冲区循环结束?




回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-7 13:33 , Processed in 0.113622 second(s), 79 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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