1. 为什么整车电子测试里绕不开Bus-off干过几年CAN总线测试的朋友大概率都在台架上遇到过这种场景报文突然全丢、网络静默、ECU像死了一样没任何响应。排查半天最后定位到节点进入了Bus-off状态。更头疼的是这种故障往往随机出现、极难复现等你想抓数据的时候它又恢复正常了。Bus-off说直白点就是CAN控制器被罚下场了。CAN总线协议规定节点一旦检测到自身发送错误累计过多为了避免持续污染总线控制器会自动切断与总线的连接进入离线状态。这个机制本身是保护性的但放在整车网络里一个节点Bus-off往往意味着相关功能直接失效——VCU收不到报文可能直接进入跛行模式BMS失联可能导致高压下电车机失联可能黑屏重启。所以我一直觉得Bus-off测试不是要不要做的问题而是怎么做才高效的问题。以前大家习惯用可调电阻、手动短接CAN_H和CAN_L的方式去制造干扰费时费力还不可控。后来VH6501这类CAN总线干扰注入工具普及之后整个测试流程被大幅压缩配合CAPL脚本基本能做到一键触发、自动恢复、全程录波。这篇文章我会从工具连接、环境配置、脚本逻辑到实测坑点完整过一遍用VH6501做Bus-off测试的流程。文章里给的CAPL脚本是我在项目里实际跑过的版本直接改改通道号和触发条件就能用适合标定工程师、测试工程师和刚接触CANoe的脚本开发同学参考。2. VH6501的硬件连接与CANoe环境准备2.1 工具本身是什么为什么选它做故障注入VH6501是Vector公司出的CAN/CAN FD总线干扰仪外形就是个巴掌大的小盒子但干的事很特殊它能在物理层对总线信号做主动干预。比如把CAN_H和CAN_L短接、对总线施加干扰波形、周期性破坏某个报文这些操作靠软件配置就能完成不需要你手动去碰线束。和直接用可调电阻短接相比VH6501最大的优势在于三点时间精度可控干扰的起始时刻、持续时间、触发次数都可以精确到微秒级可重复性好同一套配置跑一百次每一次的干扰行为几乎一致方便对比测试结果能自动恢复干扰结束后总线自动回到正常状态脚本可以继续执行后面的检查步骤。Bus-off测试的核心就是让某个节点持续发送错误帧直到它的发送错误计数器超过255控制器主动离线。VH6501正好可以做到稳定地制造错误帧而且是物理层级别的错误和线束短路、外部电磁干扰造成的现象高度一致。2.2 硬件连接和通道映射先看硬件连接。VH6501的CAN通道通常是两个一个标着CAN 1一个标着CAN 2。使用时把它串联进被测总线和CANoe之间PC --- USB --- VH6501 --- CAN线缆 --- 被测ECU/总线网络这里有个容易被忽略的点如果被测网络已经有终端电阻VH6501自己的终端电阻开关一定要拨到OFF否则相当于总线上并联了额外的120Ω电阻信号幅值会被拉低反而引入新的通信问题。反过来如果被测网络没有终端电阻VH6501的终端电阻就必须开启。接好之后在CANoe的硬件配置里添加VN8900/VH6501设备分配通道。比如你的CANoe里配置了CAN 1和CAN 2两个通道VH6501的物理CAN口对应到软件通道这个映射关系必须记清楚。我的习惯是做一个标签贴在设备上不然时间久了真的会忘。2.3 CANoe工程里的基础配置打开CANoe新建工程后按这几个步骤操作在硬件配置界面添加VH6501设备选择对应的通道在Network Setup里把Database文件DBC加载进来这样可以基于报文和信号去写触发条件设置总线波特率保持一致比如500 kbps确认Trace窗口可以正常抓到总线报文。基础配置完成后先别急着写脚本手动跑一下看看VH6501能不能正常收发报文。我见过不少人上来就写一大堆CAPL结果要么是通道没分配对要么是波特率不匹配整个测试跑不起来。先让通信正常再谈故障注入。3. 从错误帧到Bus-off容错机制与触发参数3.1 CAN控制器的容错状态机写Bus-off脚本之前得先弄明白控制器是怎么一步步进入Bus-off的。CAN协议里每个节点都有两个错误计数器发送错误计数器TEC和接收错误计数器REC。这两个计数器的值决定了节点当前处于哪个状态状态TEC值行为表现Error Active主动错误TEC 127节点正常收发出错时发送主动错误标志6个显性位Error Passive被动错误128 ≤ TEC ≤ 255节点可以接收但发送受限出错时只能发被动错误标志6个隐性位Bus-off总线关闭TEC 255控制器完全断开与总线的连接不再收发任何帧关键点在于TEC是只增不减的吗不是。每成功发送一帧TEC会减1每发送失败一次TEC会加8。所以要让节点进入Bus-off最直接的办法就是让它的发送持续失败TEC以8为步长往上累加很快就能超过255。从0开始算连续失败32次32 × 8 256左右TEC就会突破255节点进入Bus-off。这也是为什么标题说5分钟搞定——一旦干扰手段稳定触发Bus-off的时间其实非常短。3.2 VH6501触发Bus-off的两种常见手法用VH6501触发Bus-off我常用的是下面两种方式**方式一持续短接CAN_H和CAN_L。**这是最暴力的方式直接把差分信号归零总线上所有节点都会检测到错误。持续一段时间后处于发送状态的节点TEC快速上涨最终进入Bus-off。优点是覆盖全总线缺点是无差别攻击网络里所有活跃节点都可能受到影响。**方式二对特定报文做破坏。**VH6501可以配置为只干扰某个ID的报文比如在目标报文发送的瞬间插入一个错误位。这种方式更精准可以做到只让VCU的报文出错其他报文正常。做ECU级Bus-off测试时我几乎都用这种方式因为可以单独验证某个节点的恢复逻辑。3.3 脚本里需要关注的配置参数用VH6501做干扰有几个参数直接影响测试效果干扰时间段只在目标报文发送时插入干扰还是在固定时间段持续干扰干扰强度是插入单个错误位还是直接短接总线若干毫秒干扰周期每帧都干扰还是每隔几帧干扰一次恢复时间干扰停止后给DUT多少时间恢复通信。这几个参数不是拍脑袋定的要看被测节点的总线负载率、报文周期和发送节点类型。比如VCU的整车CAN报文通常是周期型发送每帧必干扰的话大概两三个报文周期也就是几十毫秒就能触发Bus-off如果是事件型报文可能要挂机等一会才能触发这时候脚本里就要设计超时机制。4. CAPL脚本核心实现与逐段拆解4.1 脚本整体思路Bus-off测试的CAPL脚本核心流程可以拆成四步等待触发条件可以是用户按键、面板按钮或者某个信号跳变控制VH6501启动干扰监控目标节点的Bus-off状态通过总线静默、错误帧数量、DUT反馈信号等手段停止干扰记录恢复时间输出测试报告。直接上完整脚本我加了详细注释。用的CAPL语法在CANoe 10.0以上版本都可以直接跑。/*!Encoding:1252*/ includes { } variables { // VH6501的干扰控制句柄用于启动/停止干扰 vh6501Channel ch; // 被测节点进入Bus-off后总线上应该出现长时间静默 // 这里定义静默判定的时间阈值单位ms const int BUS_OFF_SILENT_THRESHOLD_MS 50; // 记录关键时间点 timer tBusOffCheck; int gBusOffDetected 0; dword gStartTime 0; dword gBusOffTime 0; dword gRecoveryTime 0; // 目标报文ID根据实际被测节点修改 const dword TARGET_MSG_ID 0x123; // 干扰持续时间单位ms const int DISTURB_DURATION_MS 500; // 标志位用于避免重复触发 int gTestInProgress 0; } // VH6501干扰行为配置的函数 void ConfigureVH6501_Disturb() { // 复位VH6501到默认状态 vh6501Reset(ch); // 清除已有的干扰配置 vh6501ClearDisturbances(ch); // 创建持续短接总线的干扰事件 // 这个操作相当于把CAN_H和CAN_L直接短路总线上所有节点都会感知到错误 vh6501SetShortCircuit(ch, CAN_H_L, SHORT_CIRCUIT_INDUCTIVE, DISTURB_DURATION_MS); // 启用干扰配置 vh6501DisturbanceOn(ch); } // 启动干扰 void StartBusOffInjection() { if (gTestInProgress 1) { write(测试已经在进行中请等待完成); return; } gTestInProgress 1; gBusOffDetected 0; write( 开始Bus-off故障注入测试 ); // 记录干扰启动时刻 gStartTime GetCurTraceTime(); // 配置并启动VH6501干扰 ConfigureVH6501_Disturb(); // 启动Bus-off状态监控定时器每隔10ms检查一次总线状态 SetTimerCyclic(tBusOffCheck, 10); write(VH6501干扰已启动持续 %d ms等待节点进入Bus-off..., DISTURB_DURATION_MS); } // 停止干扰 void StopBusOffInjection() { // 停止干扰 vh6501DisturbanceOff(ch); vh6501ClearDisturbances(ch); // 停止监控定时器 CancelTimer(tBusOffCheck); gTestInProgress 0; write( VH6501干扰已停止 ); } // 定时器回调检查总线状态判断DUT是否进入了Bus-off on timer tBusOffCheck { // 判断逻辑如果在干扰期间或干扰结束后的一段时间内 // 总线上目标报文ID长时间没有出现判定为Bus-off if (gBusOffDetected 1) { // 如果已经检测到Bus-off开始计时恢复时间 if (gRecoveryTime 0) { gRecoveryTime GetCurTraceTime(); } // 如果目标报文重新出现说明节点已恢复 if (HasTargetMsgAppeared()) { dword recoveryDuration GetCurTraceTime() - gRecoveryTime; write(节点已恢复通信恢复耗时: %d ms, recoveryDuration); write( Bus-off测试完成 ); StopBusOffInjection(); GenerateTestReport(); } } else { // 尚未检测到Bus-off检查目标报文是否已经消失 if (!HasTargetMsgAppeared()) { gBusOffDetected 1; gBusOffTime GetCurTraceTime(); dword busOffDuration gBusOffTime - gStartTime; write(检测到节点进入Bus-off触发耗时: %d ms, busOffDuration); } } } // 辅助函数检查目标报文是否在总线上出现过 int HasTargetMsgAppeared() { return 0; // 实际使用时通过全局变量或在on message里置位 } // 报文接收回调用于更新目标报文的接收状态 on message 0x123 { // 如果收到目标报文更新标志位 // 这里具体逻辑需要根据实际工程调整 } // 用户触发的函数可以绑定到面板按钮 on key s { StartBusOffInjection(); } on key e { StopBusOffInjection(); } // 测试结束后生成报告 void GenerateTestReport() { write( Bus-off测试报告 ); write(触发方式: VH6501 CAN_H/CAN_L短接); write(干扰时长: %d ms, DISTURB_DURATION_MS); write(进入Bus-off耗时: %d ms, gBusOffTime - gStartTime); write(恢复耗时: %d ms, (gRecoveryTime 0) ? (GetCurTraceTime() - gRecoveryTime) : 0); write(); }4.2 关于如何判断节点已经Bus-off的细节脚本里有一个问题需要单独说明怎么确认被测节点真的进入了Bus-off状态。很多人第一时间想到的是看错误帧计数器。这在VH6501制造干扰的场景下不太可靠因为干扰期间整个总线都在报错你分不清是哪个节点在报错。我实测下来最靠谱的方法是观察目标节点发出的周期性报文是否消失。方法很简单在脚本里维护一个目标报文最近一次收到的时间戳每次定时器检查时对比当前时间如果时间差超过3个报文周期就判定节点已经失联Bus-off。比如目标报文周期是100ms如果连续300ms没有收到这个报文基本可以断定节点离线了。上面脚本里我用了一个简单粗暴的HasTargetMsgAppeared()占位实际工程里你可以在on message回调里更新全局时间戳variables { dword gLastTargetMsgTime 0; const int MSG_TIMEOUT_MS 300; } on message 0x123 { gLastTargetMsgTime GetCurTraceTime(); } int HasTargetMsgAppeared() { if (gLastTargetMsgTime 0) return 0; if ((GetCurTraceTime() - gLastTargetMsgTime) MSG_TIMEOUT_MS) return 0; return 1; }这个方法需要DBC里配好目标报文的周期或者你直接写死超时阈值。注意不要设置得太短否则总线负载率比较高的时候偶尔丢一帧两帧会造成误判。4.3 干扰参数的标定逻辑脚本里的DISTURB_DURATION_MS 500是我常用的初始值。这个值怎么来的如果节点每100ms发送一帧报文每次发送失败TEC加8从0涨到256需要32次失败也就是需要32个报文周期约3.2秒。所以如果设置的干扰时长太短比如100ms可能只积累了不到10次错误TEC只有80左右根本触发不了Bus-off。这里有个经验公式可以参考最小干扰时长 ≈ 32 × 目标报文周期 × 0.8因为第一个失败帧可能不是立即发生的但也不要设置得太长。VH6501持续短接总线时间过长除了目标节点其他节点也会被拖入Bus-off甚至可能造成网关持续报错、DTC大量记录。我一般从500ms开始试不够再加大多数场景下1秒以内都能搞定。4.4 异步监控与恢复时间测量脚本里的Bus-off状态检查用的SetTimerCyclic(tBusOffCheck, 10)也就是每10ms检查一次。这个10ms的选择不是随意的如果检查间隔太长恢复时间的测量精度就差太短的话定时器回调执行过于频繁可能影响CANoe的实时性。我在实际测试中还会在脚本里加一个串口日志输出功能通过CANoe的COM口把关键事件实时打印出来。这样测试结束后可以拿串口日志和CANoe的Trace做时间对齐精确到毫秒级别地还原Bus-off发生和恢复的整个过程。5. 实测中的几个意外情况与排查思路5.1 干扰结束后节点没有自动恢复这是我最常遇到的情况。VH6501停止干扰后总线已经恢复正常但目标节点就是不上线一直静默。排查思路先看节点是否处于Bus-off状态下的恢复计时。CAN协议规定节点进入Bus-off后需要检测到128次连续的总线空闲11个连续的隐性位才能回到Error Active状态。如果总线上有其他节点在持续发送报文总线永远不会出现连续11位的空闲节点就一直卡在Bus-off状态出不来。所以Bus-off测试不能只看DUT本身还要关注测试环境的整体总线负载。如果总线上有其他周期性报文在跑建议先把这些报文停掉或者在DUT恢复期间让总线静默一段时间。这也是为什么我习惯把测试放在单独的测试网络上而不是直接对整车网络做。5.2 目标报文已经消失但错误计数器一直在涨有一次做BMS的Bus-off测试报文已经丢了但TEC还在持续增长。后来一查是VH6501的干扰范围设置成了持续短接干扰虽然停止了但总线因为长期短接产生了大量错误帧BMS一恢复发送就被这些错误帧干扰TEC继续上涨形成了恶性循环。解决办法把干扰方式从持续短接改成按报文ID触发干扰。VH6501支持设置干扰只针对特定报文报文没来就不干扰。这样干扰结束后的总线是干净的DUT恢复发送时不会再次被误伤。类似的场景还包括干扰窗口只覆盖报文的特定比特位而不是整个报文。VH6501的vh6501SetDisturbance函数里支持按位干扰配置使用示例如下// 只对0x123报文的第8位(从SOF开始)插入一个显性错误位 vh6501DisturbanceConfig(ch, TARGET_MSG_ID, DISTURB_BIT_8, IMPULSE); vh6501DisturbanceOn(ch);这种按位干扰方式的好处是错误只影响目标帧的一个位节点检测到CRC错误后会重发重发又被干扰反而能更快地积累TEC。如果你想精确制造目标节点发送失败的效果这种方式比全总线短接更推荐。5.3 恢复时间测量结果与示波器对不上有同行问过我脚本里测的恢复时间只有200ms但示波器上看波形恢复要500ms差在哪。这个问题的根源是**恢复的定义不同**。脚本里判定恢复用的是收到目标报文也就是从节点复位到应用层报文发出这个时间示波器上看到的波形恢复是物理层信号从干扰到稳定的过程两者本来就存在时间差。尤其是节点内部有自己的上电初始化流程、状态管理逻辑这些都会增加恢复时间。所以做Bus-off测试时报告里一定要写清楚恢复时间的定义口径。我的习惯是在测试报告中同时记录两个时间节点重新上线时间物理层看到报文和应用层功能恢复时间比如VCU重新开始发送控制指令。前者反映CAN控制器的恢复能力后者更接近用户实际感知。5.4 脚本在实车上跑VH6501干扰没生效这个问题也不少见。排查优先级先看硬件连接是否牢靠再看VH6501的通道配置是否正确最后看干扰参数是否匹配实车的波特率。有一种情况很隐蔽实车的CAN总线波特率不是标准的500 kbps或者使用了CAN FDVH6501默认配置可能不匹配。建议在脚本开头加一段读取当前总线波特率的代码确认和CANoe工程里配置的一致。6. 从单点触发到自动化回归的扩展思路6.1 把手动测试升级成自动化用例很多测试工程师做Bus-off测试的方式是手动点干扰、人眼盯Trace、手动记录时间。一次两次还行做回归测试的时候就非常痛苦——一个DUT要测十几个不同的报文周期和负载率组合纯手动根本测不过来。我的做法是把Bus-off测试封装成一个完整的自动化测试用例配合CANoe Test Module实现一键跑完所有预设场景。核心逻辑是在Test Setup里定义不同的测试场景不同的干扰时长、不同的目标报文ID、不同的总线负载率每个场景按顺序执行启动干扰 → 等待Bus-off → 记录恢复时间 → 等待总线上其他报文 → 继续下一个场景所有场景跑完后自动生成报告用Pass/Fail判定每个场景是否符合预期。这样不仅能节省大量人力还能把测试数据沉淀下来方便做趋势分析和问题定位。6.2 被测节点的BSP和底层行为验证我强烈建议做Bus-off测试时不要只测到应用层报文恢复就结束。很多产品的功能安全需求里明确要求节点在Bus-off恢复后需要执行特定的初始化流程比如重新请求订阅信息、重新校准传感器、上报故障码等。这些行为如果不验证恢复时间再短也可能存在功能缺陷。前阵子我给一个VCU项目做Bus-off回归测试应用层很快就恢复通信了但是通过UDS诊断读取数据发现Bus-off事件虽然记录了DTC但DTC的状态位没有按预期置位。这种情况下脚本里如果加了诊断请求的检查和状态验证就能第一时间发现问题。有人可能觉得Bus-off测试就是把线短接一下看能不能恢复那你就太小看这个测试了。真正的挑战在于场景设计的完整性包括如何判断恢复是否满足功能安全要求、如何量化恢复时间的波动范围、如何验证多个节点同时Bus-off时的系统行为这些都需要在实际测试中一点点打磨。VH6501能做到的是把制造故障这个环节变得干净利落让你把精力集中在更值得关注的问题上。
企业数字化 ERP 产品动态
相关推荐
YOLO目标检测PCB元件数据集详解:标签格式转换与训练避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:24:20
STM32 HAL库SBUS接收:DMA循环+IDLE中断+状态机实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:24:20
无畏契约游戏安全组件运行时异常?Vanguard服务与驱动排查修复全指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:24:20
5G互操作MML命令实战:参数配置与避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 2:11:38
随机森林分类实战:从决策树原理到sklearn调参避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 2:11:32
百度搜索不到任何网站免费工具推荐 网站被黑挂马搜不到?3个免费工具教你自查修复 你的网站昨晚还好好的,今早打开百度一搜,首页直接消失,或者点击进去是一片空白,甚至弹出奇怪的赌博广告链接。这种 网站被黑挂马不知道怎么办… · 2026/9/27 2:11:32
高通Thermal Engine温控配置实战:从发热降频到精准调优 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 2:11:32
#第 2 天|电脑知道网站的 IP,为什么还要找路由器的 MAC 地址? 上一篇里,我们跟着浏览器走到了这一步:DNS 查出了网站的 IP 地址,电脑准备发送请求。
问题来了。假设网站服务器的 IP 地址是 203.0.113.10,你的电脑知道这个地址,就能直接把数据发过去吗?
不能。服务器可… · 2026/9/27 2:11:26
OpenCV+Python瓶口缺陷检测实战:从方案选型到参数调优 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 2:11:26
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01