资讯动态

AUTOSAR CAN-Tp协议详解:车规级诊断分包传输原理与实战配置

发布时间:2026/9/13 13:50:17 来源:尧图企业网站定制
1. 项目概述AUTOSAR CAN-Tp协议到底是什么为什么它在车规级通信里绕不开AUTOSAR CAN-Tp协议——这串缩写组合对刚接触汽车电子开发的工程师来说像一堵贴着CAN总线跑的加密墙看得见数据帧在示波器上跳动却摸不清那些被拆成多帧、再拼回去的报文到底经历了什么。它不是CAN物理层的“电线规则”也不是CAN FD那种带宽升级包而是AUTOSAR架构下专为解决“单条CAN帧装不下大块数据”这一硬伤而设计的传输层协议Transport Protocol。简单说CAN-Tp干的是“快递中转站”的活当ECU要发一个超过8字节的诊断请求比如读取128字节的Flash校验码、刷写一段32KB的Bootloader、或者上传一段完整的DTC快照时它把大包裹切成标准尺寸的“CAN小纸箱”每箱最多7字节有效载荷打上编号、顺序、校验码再按序发出去接收端收到所有箱子后核对编号、验算校验、剔除错件最后严丝合缝地还原成原始大文件。这不是可有可无的附加功能而是ISO 14229-1UDS诊断协议和ISO 15765-2CAN网络传输层在AUTOSAR生态里的强制落地实现。你用Vector CANoe做诊断测试背后默认启用的就是CAN-Tp你调用AUTOSAR BSW模块里的CanTp_Transmit()函数那是在调用这个协议栈的入口你看到CANoe Trace里出现0x10 0x11 0x21这类首帧/流控帧/连续帧标识那就是CAN-Tp在呼吸。它不炫技但一旦配置错一个参数——比如接收超时设成10ms而实际网络延迟是15ms整条诊断链路就卡死又或者流控帧的Block Size设得过大导致接收缓冲区溢出刷写过程直接中断报错。所以理解CAN-Tp本质是理解汽车电子系统里“可靠分包传输”的底层契约。它面向的是整车厂、Tier1供应商的嵌入式软件工程师、诊断工程师、测试工程师以及正在啃AUTOSAR标准文档却卡在BSW配置环节的应届生。如果你正被“CanTp_Transmit返回E_NOT_OK”、“流控帧未被响应”、“连续帧丢失导致校验失败”这类问题反复折磨这篇内容就是为你写的实战笔记——不讲虚的AUTOSAR分层理论只拆解协议怎么跑、参数怎么调、坑怎么踩、问题怎么查。2. 协议设计逻辑与AUTOSAR架构定位为什么非得用CAN-Tp而不是自己手写分包2.1 CAN物理层的硬约束倒逼出传输层的存在CAN总线物理层规定单帧最大数据长度为8字节CAN 2.0B这是由仲裁段、控制段、CRC段等固定开销决定的铁律。而现代汽车ECU的固件升级包动辄几百KBUDS诊断服务中的安全访问密钥交换、内存读写、例程控制等操作所需数据长度轻松突破百字节。如果强行让应用层如Dcm模块自己处理分包会带来三个致命问题第一耦合度爆炸——Dcm模块既要懂诊断服务逻辑又要操心帧序号管理、重传机制、流控策略代码臃肿且难以复用第二协议不一致——不同供应商写的分包逻辑五花八门A家ECU发的分包格式B家ECU根本解析不了整车集成时诊断工具连不上第三实时性失控——手写重传逻辑若没精细控制时间窗可能因等待超时而阻塞整个CAN任务调度影响动力控制等高优先级任务。CAN-Tp正是为斩断这种混乱而生它把分包、组包、流控、错误恢复这些“脏活累活”从应用层剥离封装成标准化的BSWBasic Software服务模块位于CAN Driver底层驱动之上、DcmDiagnostic Communication Manager之下形成清晰的“应用层→传输层→驱动层”三级流水线。AUTOSAR标准强制规定所有符合ASAM MCD-2 MC诊断描述文件标准的ECU必须通过CAN-Tp实现UDS over CAN的通信。这意味着Vector的CANoe、ETAS的INCA、dSPACE的ControlDesk这些主流工具其诊断功能模块默认只认CAN-Tp协议栈输出的标准化接口而非某家厂商私有的分包函数。2.2 AUTOSAR BSW分层中的精确坐标与依赖关系在AUTOSAR经典平台Classic Platform的BSW架构图中CAN-Tp模块稳坐于Communication Stack通信栈的核心位置其上下依赖关系像齿轮咬合般严密向上它为Dcm模块提供CanTp_Transmit()和CanTp_Receive()两个核心API。Dcm调用CanTp_Transmit()时只需传入目标PduId协议数据单元ID、指向数据缓冲区的指针、数据长度剩下的分包、寻址、流控全由CAN-Tp内部完成接收时CAN-Tp将重组好的完整PDU通过回调函数Dcm_CopyRxData()交付给DcmDcm再交给诊断服务处理。这种“只管输入输出不管中间过程”的设计让Dcm彻底摆脱了CAN帧细节的束缚。向下它依赖CanIfCAN Interface模块进行CAN帧收发。CAN-Tp不直接操作CAN硬件寄存器而是通过CanIf的CanIf_Transmit()发送CAN帧通过CanIf_RxIndication()接收CAN帧。CanIf再调用CanDriver如Mcu驱动层的CAN控制器驱动完成物理层操作。这种分层隔离使得更换CAN控制器比如从Infineon TC3xx换到NXP S32K时只需重配CanDriver和CanIfCAN-Tp和Dcm模块几乎无需修改。横向它与PduRPDU Router模块紧密协作。PduR像交通指挥中心根据PduId将上层Dcm发来的PDU路由到CAN-Tp再将CAN-Tp重组后的PDU路由回Dcm同时它还负责将CAN-Tp生成的流控帧FC帧路由到对应的目标ECU。没有PduR的智能路由CAN-Tp无法知道该把流控响应发给谁。这种设计的精妙之处在于“责任单一化”。CAN-Tp只专注三件事一是分段与重组Segmentation Reassembly按ISO 15765-2定义的SF/FF/CF/FC帧格式打包解包二是流控管理Flow Control通过FC帧动态协商发送方的发送节奏防止接收方缓冲区溢出三是错误检测与恢复Error Handling对超时、序列错误、校验失败等异常触发重传或终止。所有与CAN总线电气特性、波特率、采样点相关的配置全部下沉到CanDriver层所有与诊断服务逻辑、安全访问、例程控制相关的业务全部上浮到Dcm层。CAN-Tp成了那个沉默的“翻译官”确保两端语言不通的模块能高效对话。2.3 与同类协议的本质区别为什么不是TCP/IP也不是自定义分包有人会问既然要分包为什么不直接移植轻量级TCP/IP协议栈答案很现实资源与确定性。一个典型车规MCU如ST STM32G4、NXP S32K144RAM通常仅256KBFlash 2MB主频80MHz。TCP/IP协议栈哪怕精简版LwIP最小内存占用也要100KB以上且其拥塞控制、滑动窗口等机制引入的非确定性延迟无法满足汽车电子对实时性的苛刻要求比如动力控制任务必须在10ms内响应。而CAN-Tp是为资源受限环境量身定制的它采用停等式流控Stop-and-Wait发送方发完一帧就停下等待FC帧收到允许后再发下一帧逻辑极简内存占用仅需几个KB的缓冲区。另一个常见误区是“自己写个分包函数更灵活”。实测过就知道手写分包在实验室环境可能跑通但一上车就暴露问题比如未处理CAN总线错误帧导致的序列错乱未考虑ECU休眠唤醒时的缓冲区状态保持未适配不同波特率下的超时参数漂移。而AUTOSAR CAN-Tp经过全球主流OEM大众、丰田、通用数十年量产验证其错误恢复机制如N_As、N_Bs、N_Cr超时重传已覆盖所有车载CAN网络的极端工况。它不是技术最炫的方案但绝对是工程最稳的选择——就像汽车不用碳纤维轮毂而用锻造铝轮不是因为碳纤维不好而是因为锻造铝在强度、成本、工艺成熟度上的综合平衡点更适合每天跑一万公里的量产车。3. 核心协议帧结构与参数解析读懂0x10、0x21、0x30背后的密码3.1 四类关键帧的格式解剖与现场抓包对照CAN-Tp协议定义了四种基础帧类型它们的标识符CAN ID和数据域结构共同构成通信的“摩斯电码”。我们以实际CANoe抓包截图为例逐帧拆解假设使用标准地址模式源地址0x12目标地址0x34首帧First Frame, FF用于启动大数据传输。其CAN ID为0x123源地址目标地址组合数据域前2字节为16位长度码Length Code后6字节为数据起始部分。例如发送100字节数据长度码为0x0064十进制100数据域为64 00 XX XX XX XXXX为实际数据。关键特征是数据域第1字节的高4位为0001b即0x10这是FF帧的“身份证”。在CANoe Trace中你会看到一行标注为“FF: Len100”的记录后面紧跟着6字节数据。连续帧Consecutive Frame, CF用于传输FF之后的剩余数据。CAN ID同FF0x123数据域第1字节高4位为0010b即0x20低4位为序列号SN从0x01开始递增。例如第1个CF帧数据域为21 XX XX XX XX XX0x20 | 0x01 0x21第2个为22 XX XX XX XX XX。序列号的作用是让接收方能检测丢帧——如果收到21后直接跳到23就知道22丢了必须发FC帧要求重传。实测中若CAN总线负载率超70%CF帧丢失概率陡增此时序列号校验就是救命稻草。流控帧Flow Control Frame, FC接收方发出的“交通灯”。CAN ID为目标地址源地址0x341数据域固定3字节第1字节高4位为0011b0x30低4位为流控状态0继续发送1等待2溢出第2字节为Block Size一次允许发送的CF帧数量第3字节为分离时间Separation Time, STmin单位毫秒表示CF帧之间的最小间隔。例如30 05 00表示“继续发送每次发5帧帧间隔≥0ms”。这里有个易错点STmin0x00表示“尽可能快发送”但实际受CAN总线仲裁延迟限制并非真正零间隔STmin0xFF表示“由发送方自行决定间隔”此时需依赖发送方内部定时器。单帧Single Frame, SF用于传输≤7字节的小数据。CAN ID同FF0x123数据域第1字节高4位为0000b0x00低4位为数据长度0-7。例如发送3字节数据数据域为03 AA BB CC。SF帧最简洁但因其不涉及流控常被误用于本该用FF/CF的大数据场景导致数据截断。提示在CANoe中启用“ISO-TP Decode”插件可自动将原始CAN帧解析为FF/CF/FC/SF并显示长度、序列号等字段极大提升调试效率。未开启时你只能看到十六进制数据靠人工计算0x10/0x20/0x30来判断帧类型极易出错。3.2 关键参数的工程化取值逻辑与计算实例CAN-Tp的稳定性高度依赖四个核心超时参数的合理配置它们并非凭空设定而是基于CAN总线物理特性和ECU处理能力的精密计算N_As发送方发送超时发送方发出一帧后等待ACK即FC帧或下一个CF帧的最大时间。计算公式为N_As 2 * (T_prop T_bus T_proc)。其中T_prop为信号在CAN总线上的传播延迟约5ns/米10米线束≈50ns可忽略T_bus为CAN帧在总线上的传输时间以500kbps波特率为例1帧11位ID64位数据其他开销≈128位128/500000≈0.256msT_proc为接收方处理该帧并生成响应的时间MCU主频80MHz下执行中断服务程序约50μs。因此N_As ≈ 2 * (0.256 0.05) ≈ 0.6ms。但工程实践中为应对总线抖动通常设为1-2ms。若设得太小如0.1ms轻微延迟就会触发误重传设得太大如10ms则故障响应慢。N_Bs发送方块超时发送方发出FC帧后等待下一个CF帧的最大时间。它等于接收方处理FC帧并准备下一个CF帧的时间。计算依据是接收方MCU的中断响应时间数据拷贝时间。以S32K144为例从CAN中断触发到执行CanTp_RxIndication()函数约10μs拷贝6字节数据约2μs故N_Bs设为20ms足够宽裕。但若接收方需做复杂校验如AES解密则需延长至50ms。N_Cr接收方重传超时接收方发出FC帧后等待发送方重传CF帧的时间。它必须大于N_As否则会形成“超时-重传-再超时”的死循环。通常设为N_As的1.5倍即3ms。STmin分离时间CF帧间的最小间隔。其取值直接影响传输效率与可靠性。理论最小值为T_bus T_proc ≈ 0.3ms但实测发现当STmin 1ms时部分老旧ECU如早期Renault BCM因中断优先级设置问题无法及时响应连续中断导致CF帧丢失。因此行业通行做法是对新平台ECU设STmin0ms追求速度对兼容性要求高的项目设STmin5ms保稳定。实操心得在Vector DaVinci Configurator中配置这些参数时切勿直接填入计算值。建议先设保守值如N_As2ms, N_Bs50ms用CANoe注入错误帧如手动删除某个CF帧验证重传逻辑再逐步收紧参数用示波器测量实际CF帧间隔确保不小于STmin设定值。我曾在一个项目中因STmin设为0ms导致某供应商ECU在低温-40℃环境下CF帧丢失率飙升至15%最终改为1ms才解决。3.3 寻址模式与网络拓扑的适配要点CAN-Tp支持两种寻址模式选择错误会导致通信完全失败标准地址模式Normal AddressingCAN ID直接编码源/目标地址如源0x12、目标0x34则发送ID为0x123接收ID为0x341。优点是配置简单缺点是ID资源紧张——每个ECU对通信需独占一个ID11位标准帧ID仅2048个整车ECU超50个时ID分配极易冲突。适用于ECU数量少、通信关系固定的场景如发动机ECU与变速箱ECU点对点诊断。扩展地址模式Extended AddressingCAN ID不编码地址而是在数据域第1字节固定存放源地址如0x12目标地址由发送方在首帧数据域第2字节指定如0x34。此时所有ECU可共用同一CAN ID如0x7E0通过数据域地址区分。优点是ID复用率高缺点是数据域损失1字节有效载荷FF帧只剩5字节CF帧剩6字节。适用于ECU数量多、需广播或一对多通信的场景如网关向多个节点同步刷新参数。注意AUTOSAR标准要求同一CAN网络中所有ECU必须使用相同的寻址模式否则PduR无法正确路由。曾有个项目因网关用扩展地址、仪表盘用标准地址导致诊断请求发出去石沉大海排查三天才发现是配置不一致。解决方案是在AUTOSAR配置工具如ETAS ISOLAR中统一勾选“Use Extended Addressing”并在CanTpGeneral容器中设置CanTpAddressingFormat为EXTENDED。4. AUTOSAR配置与实操实现从DaVinci到代码生成的全流程拆解4.1 DaVinci Configurator中的关键配置项详解使用Vector DaVinci Configurator配置CAN-Tp绝非勾选几个复选框那么简单。以下是必须亲手调整的12个核心参数及其工程意义以AUTOSAR 4.3标准为例CanTpGeneral → CanTpDevErrorDetect是否启用开发错误检测。设为TRUE可在调试阶段捕获非法参数如PduId越界但会增加约5%代码体积。量产时建议FALSE以节省ROM。CanTpGeneral → CanTpVersionInfoApi是否生成版本信息API。仅调试需要量产关闭。CanTpChannel → CanTpChannelId通道ID必须与CanIf中定义的Channel ID一致。例如CanIf配置了CanIfChannelId0对应CAN0则此处必须填0。CanTpChannel → CanTpRxPduId / CanTpTxPduId接收/发送PDU的ID。此ID需在PduR模块中预先定义并关联到Dcm的PduId。常见错误是此处填了1而PduR中定义的PduId是0x100导致路由失败。CanTpChannel → CanTpAddressingFormat寻址模式NORMAL或EXTENDED前文已述。CanTpChannel → CanTpRxNSduRef / CanTpTxNSduRef指向CanIf中定义的NSduNetwork Service Data Unit引用。NSdu定义了CAN ID、DLC、方向等是CAN-Tp与CAN硬件的桥梁。若此处引用错误CAN-Tp根本发不出帧。CanTpChannel → CanTpNas / CanTpNbs / CanTpNcr即前文所述的三个超时参数单位毫秒。DaVinci中需填入整数值如Nas2。CanTpChannel → CanTpStMin分离时间单位毫秒。注意DaVinci中填0表示STmin0ms填255表示STmin0xFF由发送方决定。CanTpChannel → CanTpBsBlock Size即FC帧中指定的单次发送CF帧数。设为0表示“无限制”但实际受接收缓冲区大小限制。建议设为5-10平衡效率与内存。CanTpChannel → CanTpWftMax等待FC帧的最大次数。当接收方忙不过来时可发多次FC帧状态1要求暂停。设为0表示禁用等待机制设为3表示最多发3次等待帧后强制溢出状态2。CanTpChannel → CanTpRxBufferSize接收缓冲区大小单位字节。必须≥最大预期数据长度如刷写包最大256KB则此处至少256*1024。但MCU RAM有限需权衡。实测S32K144上设为32KB已能满足95%场景。CanTpChannel → CanTpTxBufferSize发送缓冲区大小。通常设为接收缓冲区的1/2即可因发送是主动行为可分批提交。实操心得配置完成后务必点击DaVinci的“Validate Configuration”按钮。它会检查所有引用关系如PduId是否在PduR中存在、NSduRef是否有效并报告潜在冲突。我见过太多人跳过这步结果代码生成后编译报错再回头找引用错误耗时数小时。另外DaVinci生成的.arxml文件中CanTpChannel的CanTpChannelId必须与CanIfChannel的CanIfChannelId严格一致字母大小写都不能错——XML是大小写敏感的。4.2 代码生成与关键函数调用流程DaVinci配置完成后执行“Generate Code”会输出以下核心文件CanTp_Cfg.c/h包含所有配置参数的静态数组如CanTp_ConfigType CanTp_Config { ... }其中CanTp_Config.channel[0].CanTpNas 2;。CanTp_PBcfg.c/h存放PBCfgPre-Build Configuration结构体供编译时链接。CanTp.h声明所有API函数最重要的是Std_ReturnType CanTp_Transmit(PduIdType CanTpTxPduId, const PduInfoType* PduInfo);void CanTp_RxIndication(PduIdType CanTpRxPduId, const PduInfoType* PduInfo);void CanTp_TxConfirmation(PduIdType CanTpTxPduId, Std_ReturnType result);调用流程如下以Dcm发起诊断请求为例Dcm模块调用CanTp_Transmit(CanTpTxPduId, pduInfo)传入目标PduId和指向100字节数据的指针。CAN-Tp内部将数据按FF/CF格式分片存入发送缓冲区并调用CanIf_Transmit()发送首帧FF。CAN-Tp启动N_As定时器等待FC帧。接收方CAN-Tp收到FF解析长度分配接收缓冲区发送FC帧30 05 00。发送方收到FC停止N_As定时器开始发送5帧CF21至25每帧间隔≥STmin。接收方收到CF校验序列号存入缓冲区收到最后一帧后调用PduR_RxIndication()将完整PDU路由给Dcm。Dcm处理完诊断服务调用CanTp_Transmit()返回响应流程同上。常见陷阱CanTp_Transmit()返回E_NOT_OK时新手常以为是CAN-Tp模块故障。实则90%原因是PduInfo-SduLength超过CanTpTxBufferSize或CanTpTxPduId未在配置中定义。调试时先在CanTp_Transmit()入口加日志打印PduId和SduLength再对照CanTp_Cfg.c中的CanTpTxBufferSize值立刻定位。4.3 与Dcm模块的协同配置要点CAN-Tp与Dcm的配合是诊断功能的灵魂配置错一个参数整个UDS服务就瘫痪DcmGeneral → DcmEnableDsl必须设为TRUE启用Diagnostic Session Layer会话层否则Dcm不处理任何诊断请求。DcmDspConfig → DcmDspDidRead定义哪些Data IdentifierDID可被读取。例如配置DID0xF190VIN码时需指定其数据长度、访问条件如需安全访问Level1。DcmDspConfig → DcmDspSecurityAccess配置安全访问算法。关键点是DcmDspSecurityAccessType必须与CAN-Tp的CanTpChannel中定义的CanTpAddressingFormat匹配——若CAN-Tp用扩展地址此处DcmDspSecurityAccessType必须设为EXTENDED否则安全种子请求发不出去。DcmDslConfig → DcmDslSessionRow定义会话模式。DcmDslSessionRow[0]通常是default session会话0x01DcmDslSessionRow[1]是programming session会话0x02。刷写时必须先进入programming session否则RequestDownload服务会被拒绝。实操技巧在DaVinci中配置Dcm时右键点击DcmDspDidRead选择“Add DID”输入F190系统会自动生成DID结构体。但务必手动检查DcmDspDidRead.F190.DcmDspDidReadDataLength是否为17VIN码标准长度若为0则读取时返回空数据。曾有个项目因此处漏设整车厂验收时VIN读取失败返工两天。5. 典型故障排查与避坑指南从CANoe抓包到MCU寄存器的全链路分析5.1 故障现象速查表与根因定位路径现象CANoe抓包特征可能根因快速验证方法诊断请求无响应发送FF帧后无任何FC或CF帧返回1. 接收方CAN-Tp未使能CanTpGeneral.CanTpDevErrorDetectFALSE但模块未初始化2. PduR路由错误CanTpRxPduId未关联到Dcm3. 接收方ECU未唤醒CAN总线睡眠在接收方MCU上用调试器查看CanTp_Init()是否执行检查PduR配置中PduRCanTpRxPdu是否指向正确DcmPduId流控帧FC未被响应发送方发出FC帧0x30但无后续CF帧1. 发送方CanTpNcr超时值过小2. 接收方CanTpRxBufferSize不足导致FC帧状态2溢出3. CAN总线ID冲突FC帧被其他ECU误收抓包看FC帧数据域第1字节若为320x30 | 0x02说明接收方已溢出增大CanTpRxBufferSize重试连续帧CF丢失FF后收到21、22跳到24无231. CAN总线负载率过高80%2.CanTpStMin设为0但接收方中断响应慢3. 序列号校验失败接收方缓存损坏用CANoe的Bus Load功能监控负载率将CanTpStMin改为5ms复位接收方ECU清除缓存数据校验失败所有CF帧收齐但Dcm返回0x31requestOutOfRange1. FF帧长度码错误如100字节写成0x01002. 接收方缓冲区未清零残留旧数据3. 大端小端转换错误MCU为小端但数据按大端解析抓包对比FF帧前2字节与预期长度在CanTp_RxIndication()入口加断点检查PduInfo-SduLength是否正确5.2 深度调试技巧如何用示波器锁定物理层问题当CANoe抓包显示一切正常但ECU仍通信失败时问题往往藏在物理层。这时示波器是终极武器测量CAN_H/CAN_L电压正常显性电平CAN_H≈3.5VCAN_L≈1.5V隐性电平均为2.5V。若CAN_H仅2.0V说明终端电阻缺失或线路短路。观察位时间Bit Timing用示波器光标测量一个位时间如500kbps下应为2μs。若实测为2.1μs说明波特率配置错误如采样点设为75%但硬件不支持。捕捉错误帧Error Frame错误帧由6个显性位组成持续6μs。若频繁出现表明总线存在强干扰如电机驱动器附近布线或节点故障。此时需用CANoe的Error Frame Counter功能统计错误率1%即需排查。我的独家技巧在怀疑CAN驱动问题时在CanIf_Transmit()函数末尾插入GPIO翻转代码如置高PA0用示波器测PA0波形。若CAN帧发出时PA0有脉冲但CANoe无抓包说明CanDriver未真正驱动CAN控制器若PA0无脉冲则问题在CAN-Tp或上层调用。这招帮我在一个项目中30分钟定位到CanDriver的Can_Write()函数被意外注释掉的低级错误。5.3 生产环境必做的三项验证测试量产前必须通过以下三类严苛测试否则售后将面临海量召回风险极限温度测试在-40℃和105℃环境舱中运行完整刷写流程含Bootloader更新。重点监控N_As超时——低温下MCU晶体振荡器频率漂移可能导致定时器误差超20%需将N_As放宽至3ms。总线负载压力测试用CANoe模拟100%总线负载发送大量无关报文同时发起诊断请求。若CF帧丢失率5%需优化CanTpStMin或降低总线波特率如从500kbps降至250kbps。电源波动测试用可编程电源模拟电池电压跌落如12V→9V→12V瞬变在电压跌落瞬间发起诊断请求。若ECU复位或CAN-Tp缓冲区清零说明未实现电源失效保护——需在CanTp_Init()中添加掉电检测钩子函数保存关键状态变量。最后分享一个血泪教训某车型量产半年后用户反馈4S店刷写失败率高达30%。排查发现问题仅出现在使用特定品牌诊断仪非Vector时。根源是该诊断仪的FC帧STmin设为0xFF由发送方决定而我们的ECU未正确处理STmin0xFF导致CF帧间隔过长被诊断仪超时。解决方案是在CanTp_RxIndication()中当检测到FC帧STmin0xFF时强制将本地CanTpStMin设为5ms。这个细节AUTOSAR标准文档里只提了一句却让整个项目延期两个月。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价