找回密码
 立即注册
查看: 58|回复: 1

请教一下,这种错误的帧数据是设备发送出来的,还是can分析仪解析错误

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:44
  • 最近打卡:2025-10-29 15:17:19
已绑定手机

21

主题

33

回帖

591

积分

高级会员

积分
591
发表于 2025-10-24 15:06:38 | 显示全部楼层 |阅读模式
我是用的是stc32g库函数版的candemo,只用到周期为1s的数据发送。

一个总线上一共12个这样的设备,一个分析仪。
6个设备以下时,数据正常。
设备数量多就会出现错误帧。
截图202510241500596215.jpg

然后我用mcuid做了个伪随机延迟,让每个节点发送时间不一致,去掉了程序里面的can中断,日志打印。现在正常了

截图202510241502437939.jpg

虽然问题解决了,但是我这个小白还是想知道为什么会导致这个问题


QT上位机小佬,努力学习嵌入式中,感谢各位大佬指导
回复

使用道具 举报 送花

3

主题

1848

回帖

544

积分

等待验证会员

积分
544
发表于 2025-10-24 15:08:00 | 显示全部楼层
你好,感谢你的分享和问题描述,这是一个非常典型的CAN总线通信问题,涉及总线负载、仲裁机制、时序冲突以及硬件/软件实现细节等多个方面。下面我将从技术角度分析你遇到的问题,帮助你更好地理解其本质。

一、问题现象总结

你使用的是基于STC32G的CAN Demo程序,仅用于周期性发送1秒一次的数据帧。在连接6个以下设备时通信正常,超过6个设备后出现错误帧。你通过引入伪随机延迟(基于MCU ID)以及去除CAN中断和日志打印,成功解决了问题。

二、可能原因分析

1. CAN总线仲裁机制冲突

CAN总线采用无损仲裁机制(CSMA/CA),多个节点同时发送数据时,通过帧ID进行优先级仲裁。若多个节点在同一时刻发送相同或相近优先级的帧,就会发生总线冲突,导致仲裁失败,从而产生错误帧。
在你未加入随机延迟前,多个节点可能在1秒整点时刻同时发送数据帧,导致总线拥塞和仲裁失败。

2. 总线负载过高

CAN总线的通信速率是固定的(例如500kbps),其带宽是有限的。当多个节点频繁发送数据时,总线负载(Bus Load)可能接近或超过临界值(通常建议不超过70%)。高负载会导致:
数据帧发送延迟
重传机制激活
总线仲裁失败
错误帧产生
虽然你每秒仅发送一次数据,但多个节点同时发送仍可能造成瞬时负载高峰,尤其是在帧长度较长或波特率较低时。

3. CAN中断与日志打印影响时序

你提到去除了CAN中断和日志打印后问题消失。这说明:
CAN中断处理不当可能导致发送时序紊乱,尤其是在中断嵌套或响应延迟的情况下;
日志打印(如串口输出)占用CPU资源,可能影响CAN发送的实时性,进而导致帧发送时间偏移,加剧冲突。

三、你所采取的解决方案分析

你引入了基于MCU ID的伪随机延迟,使各节点的发送时间错开,这非常有效,原因如下:
避免多个节点同时发送,降低仲裁冲突概率;
降低瞬时总线负载,避免拥塞;
提高系统稳定性,减少错误帧产生。

此外,去除中断和日志打印,减少了不确定延迟,保证了CAN帧发送的确定性。

四、关于错误帧的来源

你问到“这种错误帧是设备发送出来的,还是CAN分析仪解析错误?”我们可以从两个角度分析:

1. 设备端错误帧
CAN控制器在检测到位错误、填充错误、CRC错误、应答错误、仲裁错误等时,会自动发出错误帧;
若多个节点同时发送导致仲裁失败,主节点会进入错误状态,发送错误帧;
若CAN控制器进入错误被动状态(Error Passive),也会在发送或接收时插入错误帧。

2. CAN分析仪解析错误
分析仪本身若时钟精度不高、波特率设置不匹配、或采样点设置不合理,也可能误判帧结构;
但在你减少节点数后错误帧消失,说明问题具有可复现性与一致性,因此更可能是设备端真实发送了错误帧,而非解析错误。

五、建议与优化方向

为了进一步提升系统的稳定性和可靠性,你可以考虑以下几点优化:

1. 使用不同的帧ID或优先级

为每个节点分配不同帧ID(尤其是高优先级位),有助于提高仲裁效率,减少冲突。

2. 优化发送机制
可采用时间轮询机制或令牌机制,确保每个节点在指定时间窗口内发送;
使用定时器+延时函数而非忙等待,提高系统效率;
可引入CAN FD协议(如支持)以提升带宽。

3. 监控总线负载

使用CAN分析仪监控总线负载情况,确保不超过70%~80%,避免高负载带来的通信问题。

4. 优化中断与日志机制
使用低优先级中断或轮询方式处理CAN发送;
日志打印尽量使用DMA或异步方式,避免阻塞主程序;
若使用RTOS,可将CAN发送任务设为高优先级任务。

六、总结

你遇到的问题本质上是多节点CAN通信中由于发送时序冲突和总线负载过高导致的仲裁失败和错误帧产生。你通过引入伪随机延迟、优化软件逻辑,有效解决了问题。这种做法在工业现场非常常见,是一种典型的去同步化策略。

希望以上分析对你理解CAN通信机制有所帮助。如果你有更多关于CAN总线、嵌入式通信或MCU开发的问题,欢迎继续交流!

祝你开发顺利!

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-11-2 09:56 , Processed in 0.130967 second(s), 57 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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