QW123 发表于 2024-3-15 16:43:58

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



attach://38375.mp4



如上,过一会就好了,
产品现象,就是反应有点慢,按理应该跟上面,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 = 0x20;   //数据内容
        CAN1_Tx.DataBuffer = 0x00;
        CAN1_Tx.DataBuffer = 0x00;
        CAN1_Tx.DataBuffer = 0x00;
        CAN1_Tx.DataBuffer = 0x00;
        CAN1_Tx.DataBuffer = 0x00;
        CAN1_Tx.DataBuffer = 0x00;
        CAN1_Tx.DataBuffer = 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 = 0x21;   //数据内容
        CAN2_Tx.DataBuffer = 0x22;
        CAN2_Tx.DataBuffer = 0x23;
        CAN2_Tx.DataBuffer = 0x24;
        CAN2_Tx.DataBuffer = 0x25;
        CAN2_Tx.DataBuffer = 0x26;
        CAN2_Tx.DataBuffer = 0x27;
        CAN2_Tx.DataBuffer = 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 != rx_old)
                                                                {
                                                                        rx_old = CAN1_Rx.DataBuffer;
                                                                        CAN1_Tx.DataBuffer = (CAN1_Rx.DataBuffer )&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);    //从串口输出收到的数据
                            }
                            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);    //从串口输出收到的数据
                            }
                            printf("\r\n");
                      }
                    }
                }
      

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


llyymm 发表于 2024-3-19 12:31:48

没看明白,这是在网页上进行测试吗?

QW123 发表于 2024-3-19 13:22:35

llyymm 发表于 2024-3-19 12:31
没看明白,这是在网页上进行测试吗?

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


其实动作很简单

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

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

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

llyymm 发表于 2024-3-19 17:36:53

我也是使用的CAN分析仪进行的CAN测试,感觉CAN数据很稳定,没有出现过你这种情况,第一 STC测试板和CAN分析仪的通信速率是否完全一样?第二B产品收到数据执行动作后返回数据慢,是否执行的动作占用了中断?按理说CAN数据是一次性发送一帧的,不应该会出现压缩的情况

QW123 发表于 2024-3-20 16:12:11

本帖最后由 QW123 于 2024-3-20 16:13 编辑

llyymm 发表于 2024-3-19 17:36
我也是使用的CAN分析仪进行的CAN测试,感觉CAN数据很稳定,没有出现过你这种情况,第一 STC测试板和CAN分析 ...


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

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


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

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


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

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




页: [1]
查看完整版本: 数据缩在一起再分开,是为啥