数据缩在一起再分开,是为啥
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
没看明白,这是在网页上进行测试吗?
不是网页,是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 的过程会有反应慢的现象,具体就是会在返回过程中,数据显示缩在一起。
导致点亮不同的灯 也会滞后于动作 。
等数据显示分开正常了,灯才正常点亮。
我也是使用的CAN分析仪进行的CAN测试,感觉CAN数据很稳定,没有出现过你这种情况,第一 STC测试板和CAN分析仪的通信速率是否完全一样?第二B产品收到数据执行动作后返回数据慢,是否执行的动作占用了中断?按理说CAN数据是一次性发送一帧的,不应该会出现压缩的情况 本帖最后由 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]