0x06 内容简介与例题习题

深入浅出:UDS协议中的DTC扩展数据记录(0x19 0x06)从原理到代码实现 本文深入解析了UDS协议中用于获取故障详细信息的0x19 0x06服务(DTC扩展数据记录)。从核心概念、报文交互到ECU端与客户端的代码实现,详细阐述了如何通过该服务读取故障发生时间、计数器等关键扩展数据,为汽车电子诊断开发提供实用指南。 阅读详情

《算法竞赛进阶指南》读书笔记汇总
这里面是我在阅读《算法竞赛进阶指南》这本书时的一些思考,有兴趣可以瞧瞧!
如若发现什么问题,可以通过评论或者私信作者提出。希望各位大佬不吝赐教!

倍增基本思想

倍增,故名思意,就是成倍的增长。通常在递推时,由于状态空间过大使得线性时间复杂度无法满足要求,这是我们可以通过成倍增长的方式,只递推状态空间中在2的整数次幂位置上的值作为代表。当需要其他位置的值时,我们可以通过把该位置表示成若干个2的整数倍的和。这就要求问题的状态空间关于2的次幂具有可划分性。
在这里,我们只研究序列上的倍增问题。其他问题例如LCA等,将在0x63节探讨。

【例题】天才ACM(AcWing109)

题目链接
思路:
首先有个一个结论,对于一个集合 S S S,校验值就是取 S S S中最大 M M M个数与最小的 M M M个数,最大与最小构成一对,次大与次小构成一对,…计算所得的值。
我们来证明这个结论,假设 M = 2 , S M=2,S M=2,S中的最大值与最小值分别为 a a a与 b b b,次大值与次小值分别为 c c c与 d d d。那么如果最大与最小值为一对,次大与次小值为一对,校验值为 S 1 S_{1} S1​:
S 1 = ( a − b ) 2 + ( c − d ) 2 = a 2 + b 2 − 2 a b + c 2 + d 2 − 2 c d S_{1}=(a - b)^{2}+(c - d)^{2} =a^{2}+b^{2}-2ab+c^{2}+d^{2}-2cd S1​=(a−b)2+(c−d)2=a2+b2−2ab+c2+d2−2cd
如果最大和次小为一对,次大与最小为一对,那么校验值为 S 2 S_{2} S2​:
S 2 = ( a − d ) 2 + ( c − b ) 2 = a 2 + d 2 − 2 a d + c 2 + b 2 − 2 b c S_{2}=(a-d)^{2}+(c-b)^{2}=a^{2}+d^{2}-2ad+c^{2}+b^{2}-2bc S2​=(a−d)2+(c−b)2=a2+d2−2ad+c2+b2−2bc
我们令 S 1 − S 2 S_{1}-S_{2} S1​−S2​,则得到 S 1 − S 2 = − 2 a b − 2 c d − ( − 2 a d − 2 b c ) = 2 a d − 2 a b + 2 b c − 2 c d = 2 a ( d − b ) + 2 c ( b − d ) = 2 ( a − c ) ( d − b ) S_{1}-S_{2}=-2ab-2cd-(-2ad-2bc)=2ad-2ab+2bc-2cd=2a(d-b)+2c(b-d)=2(a-c)(d-b) S1​−S2​=−2ab−2cd−(−2ad−2bc)=2ad−2ab+2bc−2cd=2a(d−b)+2c(b−d)=2(a−c)(d−b),由于 ( a − c ) ≥ 0 , ( d − b ) ≥ 0 (a-c)\ge 0,(d-b)\ge 0 (a−c)≥0,(d−b)≥0,故 S 1 − S 2 ≥ 0 S_{1}-S_{2} \ge 0 S1​−S2​≥0
由此可知,当这样匹配值之后,结果不会变差,所以这种策略可以使得计算所得的值最大。有归纳法得证。
那么根据这个结论,我们倍增去做,每次判断一下校验值是否小于 T T T;由于计算校验值需要保证所维护的序列有序,那么我们可以利用类似归并排序的方法去排序,使得时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)。

AC代码:

#include<bits/stdc++.h>
#define LL long long
#define N 500005
using namespace std;

int n,m;
LL T;
int a[N],b[N],c[N];

bool check(int l,int r,int p){
    for(int i = r + 1;i <= r + p;i ++)
        c[i] = a[i];
    sort(c + r + 1,c + r + p + 1);
    int i = l,j = r + 1,k = l;
    while(i <= r && j <= r + p){
        if(c[i] < c[j]) b[k ++] = c[i ++];
        else b[k ++] = c[j ++];
    }
    while(i <= r) b[k ++] = c[i ++];
    while(j <= r + p) b[k ++] = c[j ++];


    LL res = 0 ;
    int L = l,R = r + p;
    int tmp = m;
    while(L < R && tmp){
        tmp --;
        res += 1LL * (b[R] - b[L]) * (b[R] - b[L]);
        R --;L++;
    }
    return res <= T;
}

void solve(){
    scanf("%d%d%lld",&n,&m,&T);
    for(int i = 1;i <= n;i ++){
        scanf("%d",&a[i]);
    }

    int ans = 0;
    int l = 1,r = 1;
    c[1] = a[1];
    while(r <= n){
        int p = 1;
        while(p){
            if(r + p <= n && check(l,r,p)){
                for(int mh = l;mh <= r + p;mh ++)
                    c[mh] = b[mh];
                r += p,p *= 2;
            }
            else p >>= 1;
        }
        ans ++;
        r ++;
        l = r;
    }

    printf("%d\n",ans);
}

int main(){
    int t;scanf("%d",&t);
    while(t --)
        solve();
    return 0;
}

汽车诊断工程师必看:UDS 0x19服务中0x06子功能的实战解析与避坑指南 本文深入解析UDS协议中0x19服务的0x06子功能(reportDTCExtDataRecordByDTCNumber),重点探讨DTC扩展数据(DTCExtendedData)的实战应用与开发避坑指南。通过真实案例展示如何利用扩展数据精准定位复杂故障,并提供六大常见问题的解决方案,帮助汽车诊断工程师提升故障诊断效率与准确性。 阅读详情

相关推荐

深入解析UDS诊断中的0x19 0x06服务:DTC扩展数据记录获取实战指南

本文深入解析了UDS诊断协议中的0x19 0x06服务,即DTC扩展数据记录获取服务。文章通过实战案例详细阐述了该服务如何获取故障发生时的关键上下文数据(如时间戳、车速等),并提供了请求响应报文解析、常见避坑指南及与其他诊断服务的协同应用,是进行汽车电子深度故障分析的必备指南。

weixin_29163581的博客 573

将0x06(16进制)转换为二进制

将0x06(16进制)转换为二进制

qq690452074的专栏 3517

从PLC到SCADA:一个真实案例带你理解Modbus故障码0x04和0x06背后的系统级问题

本文通过一个水处理厂的真实案例,深入解析Modbus故障码0x04和0x06背后的系统级问题。从现场设备到SCADA系统的多层交互中,揭示了通信任务调度、总线噪声干扰等关键因素,并提供了诊断框架和优化方案,帮助工程师有效应对工业自动化中的通信故障。

weixin_30333885的博客 512

IP报文格式

IP报文格式网络层位于TCP/IP 协议栈数据链路层和传输层中间,网络层接收传输层的数据报文,分段为合适的大小,用IP 报文头部封装,交给数据链路层。网络层为了保证数据包的成功转发,主要定义了以下协议:IP(Internet Protocol)协议:IP 协议和路由协议协同工作, 寻找能够将数据包传送到目的端的最优路径。IP 协议不关心数据报文的内容,提供无连接的、不可靠的服务

SmartWan的专栏 8628

汇川伺服Modbus通讯调试笔记:从报文抓包到问题定位(附0x03/0x06/0x10命令详解)

本文详细解析了汇川伺服Modbus-RTU通讯调试的关键技术,包括0x03/0x06/0x10命令的报文解析与问题定位方法。通过实战案例和时序分析,帮助工程师快速解决通讯故障,提升工业自动化系统的稳定性和效率。

weixin_29169899的博客 368

Modbus-RTU三大核心功能码(0x03/0x06/0x10)工程实现详解

Modbus-RTU是工业自动化中应用最广泛的串行通信协议,其本质是一种基于主从架构、面向寄存器的简单数据交换机制。协议通过功能码定义操作语义,其中0x03(读保持寄存器)、0x06(写单个寄存器)和0x10(写多个寄存器)构成嵌入式设备通信的底层支柱。理解其帧结构、CRC-16校验规则、大端字节序要求及地址映射逻辑,是保障RS-485总线可靠交互的技术前提。在MCU固件开发中,需兼顾硬件时序(如DE/RE方向控制)、内存安全(越界检查、原子写入)与异常响应机制,广泛应用于PLC数据采集、传感器配置与执行器

weixin_42596214的博客 297

modbus-RTU协议详解,测试方法,名词介绍

最近有用到modbus协议,就把之前原来收集的资料全都拿出来又复习了一遍。发现以前了解的也忘了差不多了。所以这次理解了赶紧做个总结,省的下次再忘记了。 modbus完整支持很多功能码,但是实际在应用的时候常用的也就那么几个。具体如下: 0x01: 读线圈寄存器 0x02: 读离散输入寄存器 0x03: 读保持寄存器 0x04: 读输入寄存器 0x05: 写单个线圈寄存器 0x06: 写单个保持寄存器 0x0f: 写...

qq_26150661的博客 1638

UDS诊断0x19 0x06:DTC扩展数据记录读取与解析实战

在UDS诊断中,DTC状态位只能反映故障的当前状态,而故障发生的深层原因往往隐藏在扩展数据记录中。本文围绕UDS诊断协议中的0x19服务,深入讲解0x06子功能——通过DTC编号读取扩展数据记录的原理与工程实践。从扩展数据记录与快照记录的本质区别,到请求和响应帧的逐字节拆解,再到老化计数、发生次数、时间戳等关键统计信息的实际应用,结合代码实现、多帧重组、常见NRC错误和自动化验证方法,帮助诊断开发与售后测试人员全面掌握这一关键技术,高效完成故障分析、产测验证和OBD诊断软件开发。

weixin_29192211的博客 121

C语言杂记 0x06

数组 数组初始化 int a[5] = {[2] = 3}; 注意:数组和结构体不同,不能相互赋值 int a[5] = {1,2,}; int b[5] = a;//错误的 数组作为函数的参数时 int function(int array[5]); 查看编译预处理之后、预处理之前的代码 gcc -E main.c 字符串 字符串就相当于字符数组,所有的字符串最后...

Anhongzhan的博客 592

单片机Modbus RTU实战:用0x03/0x06/0x10功能码控制电机(附0xFF地址修改秘籍)

本文详细介绍了单片机Modbus RTU协议在电机控制中的实战应用,重点解析0x03、0x06和0x10功能码的实现方法,并揭秘0xFF地址修改秘籍。通过寄存器映射设计、代码实现解析及调试技巧,帮助工程师高效解决工业自动化中的电机控制问题,特别适合RS-485网络环境下的分布式控制系统。

weixin_30905981的博客 416

Modbus RTU从机开发避坑指南:Python处理0x03/0x06/0x10功能码的5个常见错误

本文深入探讨了Python开发Modbus RTU从机时处理0x03/0x06/0x10功能码的5个常见错误,包括串口帧边界识别、寄存器地址映射、CRC校验优化、多线程安全和异常恢复。通过工业现场验证的增强方案,帮助开发者规避技术陷阱,提升通信稳定性和效率。

solidity8miner的博客 255

OBD服务简述5--0x05与0x06服务

OBD之05/06服务

qq_40633122的博客 959

UDS协议0x19服务0x06子功能详解:按记录号读取DTC扩展数据

在汽车电子诊断开发中,UDS协议是ECU诊断与OBD测试的核心基础。诊断服务里的DTC(故障诊断码)机制,不仅记录故障本身,还关联了故障发生时的环境数据,如车速、电压、里程等,这些扩展数据对故障定位和售后分析至关重要。通常0x04子功能会一次返回全部扩展数据记录,但在总线负载高或数据量大时容易超时丢帧。而0x19服务下的0x06子功能,支持按记录号精准读取某一条扩展数据,请求报文固定为6字节,响应结构明确,能有效减少传输负载、提高诊断效率。该功能在产线EOL检测、远程诊断、OTA刷写后验证等场景中应用广泛。

weixin_34294649的博客 317

ModBus协议-功能码-0x06

06 (0x06) Write Single Register This function code is used to write a single holding register in a remote device. The Request PDU specifies the address of the register to be written. Registers a

Andy's Blog 1万+

UDS诊断0x19服务0x06子功能详解:按DTC读取扩展数据记录

在汽车电子诊断领域,UDS(统一诊断服务)是ECU与诊断仪之间通信的核心协议,而DTC(诊断故障码)则是记录车辆故障状态的标准化载体。当工程师从CAN总线上读取到故障码后,往往需要进一步获取故障发生时的深层数据,例如老化计数器、发生次数、环境参数等。这类信息正是通过UDS 0x19服务的0x06子功能——报告扩展数据记录来实现的。它不同于0x02子功能仅返回DTC列表和状态位,而是围绕具体DTC提供附加的统计与累计信息,帮助开发与售后人员判断故障是偶发还是永久,定位问题根因。理解0x06的报文格式、DTC编

weixin_34199335的博客 334

C# Modbus通信从入门到精通(27)——Modbus TCP(0x06功能码与C#代码实现)

本文详细介绍了ModbusTCP协议中0x06写单个寄存器功能码的原理、发送报文、返回报文,由高级工程师多年经验总结而成,绝对干货!

qq_34059233的博客 2637

在 Modbus RTU 协议中,功能码通常用 03 或 06 表示。说明书中有时会写成 03H 或 06H,其中的 H 代表什么?另外,0x03 和 0x06 又是什么?这些表示法之间有什么区别?

2.03H和06H:在这里,后面的**H**表示这是以十六进制形式表示的数字。3.0x03和0x06:这也是十六进制表示法的一种,前缀**0x**是编程中常用的表示,表明后面的数字是以十六进制表示的。1.03和06:这是以十进制形式表示的数字,代表功能码的值。-**0x03/0x06**同样是十六进制表示,但使用了常见的前缀**0x**。-**03H/06H**是十六进制表示,H代表"Hexadecimal"。-**03/06**是十进制表示。

huiyuanzhenduo的博客 1408

ODX介绍与UDS诊断服务Sub-Function=0x06的描述

ODX,全称Open Diagnostic data eXchange,是一种用于描述汽车电子系统和网络的标准格式。它定义了一种通用的数据交换格式,用于在不同的汽车诊断工具和ECUs之间进行数据交换。ODX的主要目的是使不同厂家和工具之间实现诊断数据的兼容性和可交互性。UDS,全称Unified Diagnostic Services,是一种用于汽车诊断的标准服务协议。它定义了一套服务和协议,用于在汽车ECU和诊断工具之间进行通信。

一直在水些技术小文 393
上一篇: 0x05 内容简介与例题习题
下一篇: 0x07 内容简介与例题习题
juruo_c
博客等级 码龄6年 520粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值