news 2026/10/20 17:41:19

UDS 2E服务全解析:从报文格式到VIN码写入实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UDS 2E服务全解析:从报文格式到VIN码写入实战

干过车载诊断这块的兄弟应该都有同感:不管你是做ECU开发、诊断测试,还是整车下线的产线标定,UDS这套协议绕不过去,而其中2E服务——WriteDataByIdentifier,按标识符写数据,更是日常打交道最多的几个服务之一。平时写VIN码、写序列号、刷配置字、标定参数,十有六七都要走这个服务。但很多刚入门的朋友只会在诊断仪上点一下“写入”,看到正响应就以为完事了,真到产品出了问题、DID写不进去、负响应代码看不懂的时候,才发现自己对这个服务的理解停留在表面。

这篇我就把自己在项目里用2E服务的经验梳理一遍,从服务定位、报文结构、安全机制,到实际写VIN码的完整过程、DID权限表设计,再到常见NRC的排查思路,一次讲透。内容对正在做UDS诊断栈开发的工程师、负责诊断脚本编写的测试人员、以及刚接触车载通信协议的同学都适用,看完至少能让你少走几次弯路。

1. 2E服务在UDS诊断体系里的定位

1.1 诊断服务家族里的“写入者”

ISO 14229定义的UDS服务分成好几个功能组,比如诊断和通信管理(10、11、27、28、3E等)、数据传输(22、2E、3C、3D)、输入输出控制(2F、31等)等等。2E归在数据传输组,它的任务简单来说就一句话:通过DID(Data Identifier,数据标识符)往ECU里写入一段数据。

注意这里的关键是“通过DID”。DID就是ECU内部数据项的门牌号,比如0xF190代表VIN码、0xF191代表零部件号、0xF1A0代表软件版本相关信息。诊断仪发起2E请求时,请求报文里必须带着DID,告诉ECU你要写哪一门牌号下的数据。ECU收到后,先查这个门牌号是否存在,再查当前会话和安全等级够不够,最后查数据长度和内容是否合法,全部通过才写入并返回正响应。

这是个“单一动作”服务,跟它的读对应物——22服务ReadDataByIdentifier是一对。在设计诊断规范的时候,通常会把可读可写的DID单独列一张表,标注好读写属性、数据长度、访问条件,2E服务就负责处理其中“可写”的那些。这个表的合理性,直接影响后面诊断功能能不能顺利过审、产线能不能顺利跑起来。

1.2 2E与31、34/36/37服务的边界

很多初学者会把2E和31服务(例程控制)搞混,也会纠结“写大量数据时该用2E还是34/36/37”。我个人的判断标准是这样:

  • 2E适合小数据量、结构化的单次写入。比如VIN码17字节、配置字几个字节、密钥几字节。一次请求把数据和DID一起发过去,响应也简单,正响应就是6E加回显DID。
  • 31服务适合触发一个动作。比如“擦除整块Flash”“激活某个校准页”,它不是直接写数据,而是让ECU去执行一段程序。虽然31服务也可以带参数,但核心语义是“运行例行程序”。
  • 34/36/37是下载/上传数据的成套服务,适合几十KB甚至几MB的大块数据,比如BootLoader刷写、整包Flash更新。用34请求建立下载会话,36循环发送数据块,37结束下载,这套流程有传输层状态机管理,不能拿2E去硬扛大块数据。

实际项目里最常见的错误,就是用2E去写Flash区里的一大段标定数据。2E从协议设计上就期望“一次请求、一次响应、短小精悍”,你要是拿它传几KB数据,CAN帧数会非常夸张,容易触发各种超时,安全性也不好控制。标定大数据老老实实走34/36/37,或者直接用XCP/CCP,别难为2E。

2. 2E服务的报文格式与关键参数拆解

2.1 请求报文逐字节分析

2E服务的请求格式固定为:

字节位置内容说明
第1字节0x2E服务标识SID
第2字节DID高8位如0xF1
第3字节DID低8位如0x90
第4字节起用户数据长度取决于DID定义,理论最多支持到传输层上限

举个例子,往DID 0xF190写入VIN码“WBA12345678901234”(17个字符),请求报文里的数据部分就是:

2E F1 90 57 42 41 31 32 33 34 35 36 37 38 39 30 31 32 33 34

算上SID和DID,总长度20字节。这里要特别提醒:0xF1是UDS文档里划给OEM自定义区域的DID起始段,实际项目里DID分配表通常由诊断规范统一定义,不同ECU的0xF190含义可能完全不同,别拿一个项目里的经验硬套另一个产品。

2.2 正响应与负响应的判定规则

正响应的格式很清晰:第一个字节是SID + 0x40(即0x6E),后面回显DID,不带用户数据。以刚才写VIN的请求为例,正响应是:

02 6E F1 90 00 00 00 00 00

等等,这里其实有个容易理解错的地方。UDS正响应报文最短可以是“SID + 回显DID”共3字节,后面的00是填充还是数据?以ISO-TP协议来看,单帧报文剩余字节一般有填充,具体取决于收发双方约定的填充规则。所以解析正响应时只关注前3字节就够了。

负响应稍微复杂点,统一格式是:

03 7F 2E [NRC]

其中NRC是负响应码。常见几个我会在第五章详细讲,这里先记住:ECU返回负响应,说明这条写入请求被拒了,必须看NRC才能定位原因。另外注意别把NRC和正响应的6E混在一起,0x7F永远是负响应标识,跟0x6E就是对立关系。

2.3 时序参数P2与S3对写入操作的影响

诊断时序参数在2E服务里容易被忽视,但实际排查时却经常是元凶。ISO 14229规定诊断仪请求发出后要等ECU回响应,分两个时间窗口:

  • P2(Server_processing_time):默认上限50ms,ECU必须在P2内响应。如果ECU判断自己处理不完(比如写Flash期间耗时较长),应该先回一个NRC 0x78(Response Pending),告诉诊断仪“我还活着,再等等”,然后进入P2*处理时间,通常可以延长到5秒。
  • S3(Server_session_time):这是会话保持超时,一般20秒。如果从上一个请求算起S3超时没有新请求,ECU会从扩展会话自动回退到默认会话,之后你再发2E请求,就可能收到0x22(条件不满足)错误。

项目上最常见的时序问题,就是诊断仪端把P2设置得很短,比如10ms,而ECU写Flash时响应慢了点,直接导致诊断仪那边先报了通信超时。我处理过的一个量产项目就是这样,后来把诊断仪端的P2超时调到50ms、P2*调到5s,问题就消失了。

2.4 会话切换与安全解锁的前置条件

2E服务发起前,多数ECU要求诊断仪处于扩展会话(扩展诊断模式,通过10 03切换)且完成安全访问(27服务解锁)。这俩前置条件缺一个,2E都进不了正响应流程。

有个细节容易踩坑:安全访问的解锁状态和会话状态是有依赖的。正常流程建议:

  1. 先用10 03进入扩展会话。
  2. 用27 01请求种子,27 02发送Key,等待解锁成功正响应。
  3. 然后发2E写数据。

如果在默认会话下先解锁,再切会话,解锁状态可能被清掉。协议里没有强制规定会话切换必须清解锁状态,但很多ECU实现里是会清掉的。我在实际测试中就遇到过:某车型的ECU在会话切换后安全等级归零,导致后面2E一直返回0x33,排查半天才发现是会话切换把解锁状态搞丢了。

3. 2E服务在实车项目里的典型应用场景

3.1 产线写VIN码的完整流程拆解

写VIN码是2E服务最经典的应用。整车下线时,产线设备通过诊断口连接车辆,把车辆唯一标识写入网关、BCM、TBOX等多个ECU。以某ECU为例,完整流程如下:

第一步,建立通信。通常先发10 03进入扩展会话。

发送: 02 10 03 响应: 02 50 03

第二步,安全解锁。写VIN属于敏感操作,一般需要27服务Seed&Key校验。实际项目中密钥算法由OEM掌控,产线诊断仪内置了对应的算法库。

发送: 02 27 01 响应: 04 67 01 1A 2B 3C 4D 发送: 06 27 02 5E 9A 17 22 响应: 02 67 02

第三步,发送2E写入VIN。假设DID是0xF190,VIN是17字节“WBA12345678901234”:

发送: 14 2E F1 90 57 42 41 31 32 33 34 35 36 37 38 39 30 31 32 33 34

这条请求数据部分加上DID共20字节,ISO-TP会做单帧发送(经典CAN单帧有效负载8字节,超过7字节数据要组首帧/连续帧,这条请求已经超过单帧容量,具体组包我下面细说)。正常情况下ECU返回:

响应: 03 6E F1 90

到这里,一次VIN写入就完成了。但我不建议只在流程层面跑通就收工,写入之后还要做回读校验,通常发22服务读0xF190,把返回的17字节和写入值比对。回读校验这个步骤看似多余,却是产线防错的关键。我就见过写入正响应正常返回、实际存储却因为Flash写失败而出错的案例,不校验根本发现不了。

3.2 ISO-TP组包:2E数据太长时的传输层细节

前面那条20字节的请求,经典CAN单帧根本装不下,这时候会走ISO-TP(ISO 15765-2)组包。ISO-TP的机制就是:第一个包叫单帧(SF),如果装不下就发首帧(FF)+ 连续帧(CF)。一条20字节的请求,在8字节DLC的经典CAN上,首帧会带6字节有效载荷,剩余数据拆成两个连续帧,每个连续帧带7字节。

FF: 10 14 2E F1 90 57 42 41 CF: 21 31 32 33 34 35 36 37 CF: 22 38 39 30 31 32 33 34

注意首帧的第1字节0x10是帧类型标识,低4位0x04表示长度4?不对,这里得仔细说:首帧第1字节的高4位是帧类型0x1,低4位是长度的最高4位;第2字节是长度低8位。0x10 0x14表示总长度20字节。CF的第1字节低4位是帧序号,依次0x1、0x2递增。ECU按照报文标识符或接收逻辑判断当前处于接收过程中,必须等全部帧收齐才能组出完整请求,任何一帧丢了整个请求就失败了。

很多人用CAN卡发送时图省事,直接让上位机把20字节塞进一个单片数据里,结果总线上一看全是截断的乱码。正确的做法是用支持ISO-TP的诊断库或者自己实现组包函数,别裸发CAN帧。

3.3 配置类DID写入与多ECU同步场景

除了VIN,2E还经常用来写配置字、参数集编号、防盗匹配数据。比如更换BCM后,售后诊断仪要把车辆的选装配置码写进去,回复原车的功能配置,不然新换的BCM某些功能就是禁用状态。

这类场景有一个特点:DID多、数据量小、但逻辑关系强。比如某个ECU上有0xF120(车型代码)、0xF121(高低配标志)、0xF122(排放标准)三个DID,产线投线时要求三个一起写,而且配置组合必须匹配:车型A配高配标志,车型B配低配标志,乱写会让ECU上电自检报错。

这种情况下2E服务本身不负责检查组合合法性,它只负责把数据存到对应的DID。组合校验逻辑要写在ECU的应用程序里:收到2E写入后不是简单存Flash,还要做合法性判断,不合法时返回NRC 0x31(请求超出范围)或者0x72(一般性编程失败)。我在设计诊断规范时通常会强制要求:凡是跟功能配置相关的DID,写入时必须做组合校验,不能只做单条数据的范围检查。这一条在质量审核时经常被点名,务必要提前考虑。

多ECU同步场景也挺常见。新能源车上网关、充电控制器、BMS都要写整车VIN,不可能一台台手动写,产线上会通过网关做路由或者用诊断仪循环访问不同地址。此时要关注ECU的物理寻址和功能寻址差异。2E属于安全敏感操作,强烈不建议用功能寻址(0x7DF这类广播地址)去写每个ECU,一旦某个ECU没做好安全校验,广播写操作的风险没法控制。我见过一个项目最开始图省事,用功能寻址发2E,结果网关刷写时把全部ECU的VIN都改了,最后还是老老实实改回物理寻址轮询。

4. 2E服务实现阶段的核心设计思路

4.1 DID权限表:读写属性、访问条件、长度约束

如果把2E服务比作一个门禁系统,DID权限表就是门牌号的登记册。ECU的诊断栈实现里,至少要有一张静态表,每个条目记录:DID编号、读写属性(RW/RO/WO)、安全等级要求、有效会话、数据长度、数据范围约束。

实际项目里我推荐的做法是,把这张表做成代码里的配置数组,类似:

typedef struct { uint16_t did; uint8_t read_perm; // 是否允许22读 uint8_t write_perm; // 是否允许2E写 uint8_t security_lvl; // 需要安全等级 uint8_t session_mask; // 允许的会话掩码 uint8_t data_len; // 固定长度,0表示可变 uint16_t min_val; // 范围约束 uint16_t max_val; } DidAttributeType;

DID权限表的好处是诊断逻辑和业务逻辑解耦。诊断栈只需要查表判断“能不能写、够不够安全、长度对不对”,至于数据写进哪个Flash地址、要不要触发校验,由对应的业务处理函数挂钩。我在代码审查时发现过一种坏味道:有的开发为了方便,把DID权限判断直接写死在2E服务处理函数里,来一个新DID就加一个if,加了几十个分支后代码根本没法维护。用表驱动,新增一个DID只需要加一条记录,挂一个回调函数,清爽很多。

注意长度校验的分寸。固定长度DID,比如VIN固定17字节,长度不对直接返回0x13(IncorrectMessageLengthOrInvalidFormat)。但有些DID允许变长,比如存储诊断故障码扩展信息的DID,这时长度校验就只做上下限检查。别把长度约死,否则以后DID数据格式升级,还得改诊断栈代码。

4.2 条件校验:写入不是“存数据”那么简单

很多做应用层开发的同事对2E服务有个误解:觉得2E就是把数据存进内存或者Flash,存完返回正响应就完事了。实际上真正量产ECU里,2E写入之后往往要触发一串后续动作。

我举几个常见例子:

  • 写VIN码后,ECU需要更新VIN相关的校验和,并且可能要在Flash里做双备份存储。
  • 写配置字后,ECU需要重新加载该配置对应的功能模块参数。
  • 写防盗相关DID,会触发防盗算法状态的更新,甚至要求重新上电才能生效。
  • 写标定参数时,可能要求确认当前车速为零、发动机停机等安全条件。

这些条件如果都不满足,应该在2E处理函数里返回0x22(ConditionNotCorrect),而不是照常写入。条件校验的顺序也重要。按照UDS推荐的负响应码优先级,通常顺序是:先查DID存在性(不存在返回0x31)、再查会话和访问权限(0x7F或0x22/0x33)、再查长度(0x13)、再查应用条件(0x22)、最后尝试写入(写入失败0x72)。如果顺序搞乱,比如先查应用条件再查安全解锁,会导致没解锁的请求返回0x22而不是0x33,给上游诊断仪的解析逻辑增加不必要的困难。

4.3 大块数据写入的边界:2E该管多大

前面说过,2E面向短数据,但“短”到底是多少,项目里要有明确约定。

按经典CAN和ISO-TP的组合,单帧能承载的最多用户数据是7字节(DLC8去掉PCI占用1字节)。再往上就要组首帧+连续帧。ISO-TP协议本身支持最大4095字节,但这不代表2E就该持续写几KB数据。

我给项目定规范时一般这么写:2E服务单条写入数据长度不超过256字节。超过这个数,一律走34/36/37服务。为什么是256?因为很多ECU内部定义DID数据缓冲区的上限就是256,再大就超过连续内存分配能力了,尤其是那些跑在MCU上的小内核,RAM紧张,硬塞一个几KB的临时缓冲区既浪费又不安全。

另外要提醒的是写操作的原子性。2E写入应该整包数据全部到位后再执行写入动作,中间缺帧错帧都不能触发实际存储。实现上最好是收完完整请求、完成全部校验后,一次性写入Flash或者RAM。如果边收边写,传输中断时Flash里就可能留了半截数据,那就不叫原子操作了,后患无穷。

4.4 掉电保护与写入确认机制

2E写Flash,最大的风险是写入过程中掉电。Flash编程中途掉电,轻则数据没写进去,重则整块Flash状态异常,下次上电ECU引导失败。这块是量产项目最容易忽略的。

成熟的做法是:至少在数据层做双备份(Double Bank)或者脏数据标记。简单说就是Flash里存两个区,先写备份区,写成功后置标志,再写主区,最后把标志位更新为“当前生效区是主区”。下次上电先检查标志位,发现主区不完整就自动切到备份区,保证ECU还能正常工作。

2E服务的正响应应该什么时候回?稳妥是等数据真正落Flash成功之后再回正响应,而不是数据暂存RAM就回。这样诊断仪端收到正响应,就可以认为数据已经持久化完成,产线上随后断电也不会丢数据。代价是响应时间变长,可能需要先回0x78(Response Pending)再回最终结果。很多OEM的诊断规范都会明确要求:涉及Flash写入的DID,允许ECU回一次0x78,最终正响应必须在写操作全部完成后发出。

5. 2E服务实战中的常见问题与排查实录

5.1 负响应码速查表与排查思路

实战中2E服务绝大多数异常都能通过NRC直接定位。我把常见情况整理成表,方便现场排查时一眼定方向:

NRC含义常见触发原因排查方向
0x13长度或格式错误写入数据字节数与DID定义不一致核对DID表长度定义,检查发送数据是否有删减
0x22条件不满足未进扩展会话、操作时序不对、条件标志未满足检查10 03会话状态,查条件校验逻辑
0x31请求超出范围DID不存在、DID不可写、写入值非法查DID表,查范围校验逻辑
0x33安全访问拒绝未解锁、解锁过期、密钥错误重新执行27服务完整流程,检查解锁状态
0x72一般性编程失败Flash写入失败、校验失败、物理存储异常查Flash驱动,查硬件,查供电
0x7E子功能不支持2E请求带了错误的子功能字节查请求报文是否多夹了字节
0x7F服务不支持诊断仪根本不该发2E查ECU诊断配置,确认2E服务是否使能

这里有个关键技巧:诊断仪把DID和NRC组合起来看,基本能缩小到具体DID。比如2E访问0xF190返回0x33,那基本确定是这个DID要求安全等级,当前State没达到。如果返回0x31,很可能DID根本不在可写集合里。带着NRC再去看DID表,问题一般很快能浮出水面。

5.2 总线工具实操:用CAN卡复现2E写入过程

现场排查时不能只依赖诊断仪的黑盒界面,最好直接用CAN工具抓总线报文。以常见的CAN分析工具为例,我用CANoe/CANalyzer比较多,操作流程大致这样:

  1. 新建工程,正确配置CAN通道的波特率(大部分车载网络500kbps,也有2Mbps的CAN FD)。
  2. 使用诊断发送功能,配置一条2E请求,填入DID和数据。
  3. 手动触发发送,同时启动Trace记录,观察ECU的响应报文和响应时间。

要注意的是Trace里的报文方向和时间戳。请求发出和响应返回之间的时间差,就是ECU处理时间,如果这个时间超过P2而ECU又没回0x78,那就是ECU端时序出了问题。建议在总线工具里打开时间戳显示,精度至少要毫秒级。

如果手上没有CANoe这种商业工具,也可以用Python加USB-CAN适配器实现类似功能。核心就是自己拼接ISO-TP帧并发送。比如用python-can库,自己实现一个简单的ISO-TP发送函数,把2E请求拆成单帧或首帧连续帧。实测下来脚本方式做单条诊断测试完全够用,但要做完整诊断仿真还是建议用专业工具。

5.3 实际项目里踩过的坑

第一个坑是“没解锁就写”。有一阵子做售后诊断仪联调,反复出现2E返回0x33。查日志发现诊断仪在发2E之前确实发了27解锁,但解锁用的Key算法和ECU端不一致,ECU校验失败,解锁根本没成功。这个坑的隐蔽点在于:诊断仪端的解锁成功提示是“请求已发出”,不是“校验已通过”。正确的做法是看27服务02子功能是不是返回了0x67正响应,同时最好在ECU端打印安全状态日志。

第二个坑是“写完没校验”。某项目上线后发现部分ECU的VIN明显不对,但产线测试报告全是Pass。一查才知道产线流程里写完2E就没做22回读,而某个批次的ECU Flash写入存在偶发性的半字节翻转。后来在产线流程里加了自动回读,问题立刻暴露,再配合Flash驱动层加校验才根治。从那以后我对写类服务基本养成一个习惯:写后必读,这是成本最低的可靠性保障。

第三个坑是“单帧/连续帧错位”。用第三方诊断仪写一个很长的DID时,抓报文发现请求只发了一半,对方就超时了。排查后发现是诊断仪配置里CAN帧类型被设成了单帧,超长数据直接截断发送。换成自动组包模式后恢复正常。这种问题在现场很容易被误判为ECU故障,实际上就是工具配置问题,先抓总线报文是最快的破案方式。

第四个坑是关于0x78的响应处理。有一个ECU写Flash数据时耗时较长,会先回0x78,再在几百毫秒后回最终正响应。但诊断仪端在收到0x78后没有正确处理,直接判定为负响应,导致流程中断。这个问题的根因是诊断仪侧的状态机没实现Response Pending处理机制,收到0x78不知道要等待后续响应。排查时看Trace里其实有响应,只是诊断仪没认,容易被误导成ECU不回消息。

5.4 2E服务测试的自动化设计思路

如果你负责诊断测试,建议把2E服务用例自动化。我搭建过一套基于CAPL的UDS自动化测试脚本,大致用例覆盖这些点:

  • 会话切换前置条件测试:分别在默认会话、扩展会话、编程会话下发2E,预期只有合法会话能成功。
  • 安全解锁前置条件测试:未解锁、解锁成功、解锁后又切会话,分别下发2E,预期结果各不相同。
  • 长度边界测试:DID固定长度17字节,分别发16、17、18字节,验证0x13负响应逻辑。
  • 数值边界测试:配置DID允许范围0~100,写入101应该返回0x31。
  • 断电测试:写入过程中模拟掉电,重启后检查数据完整性(这个需要台架配合)。
  • 写后回读测试:每次写入成功后自动发22读回,比对数据一致性。

自动化用例的关键是断言写在后置条件里,比如解锁流程要完整执行并通过,不能因为安全性检查不通过就把整个用例跳过。测试报告里要把每条请求报文、响应报文、NRC、处理时间全部记录下来,这样后续排查问题才有据可依。

写在最后的一点个人体会

2E服务从协议角度看并不复杂,真正让它变得复杂的是藏在DID背后的业务逻辑:安全等级、会话管理、条件校验、Flash可靠性、多ECU协同。我这些年做下来,最大的感受是——设计诊断服务时多花一小时做权限表和条件梳理,能省下后续几个月在生产现场和售后排查上的大量精力。2E服务写坏了数据,不是改个报文就能恢复的,轻则重新写,重则得返工更换控制器。如果你现在正准备设计诊断规范或者实现诊断栈,建议把你计划暴露的DID一个个过一遍:可读还是可写,什么条件下可写,写失败了会怎样。这块抠得越细,后面越稳。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 17:41:18

县域创新转化困局如何破?智能引擎驱动AI+技术转移实操方案

简介:这份文档面向县域创新主管单位、技术经理人及科技服务从业者,聚焦科技成果转化中技术评估薄弱、供需对接低效、推广资源分散等现实难题,提出以AI智能引擎重构转化体系的思路。内容围绕“智能评估—精准匹配—生态协同”三位一体模式展开…

作者头像 李华
网站建设 2026/10/20 17:41:10

物理规律导向视频模型:技术路线、实操要点与常见问题排查

1. 物理规律导向视频模型到底在解决什么问题 视频生成模型这两年迭代速度极快,从最早的几秒模糊片段,到现在能出十几秒甚至更长的连贯画面,进步肉眼可见。但如果你真正拿这些模型做过内容生产,就会发现一个特别尴尬的现象&#xf…

作者头像 李华
网站建设 2026/10/20 17:41:07

腾讯WorkBuddy独立文件浏览器:本地文件直连AI处理

1. 从"文件浏览器"这个动作看AI办公工具的入口争夺 腾讯WorkBuddy上线独立文件浏览器这件事,乍看只是一个功能更新,但如果你在一线做过AI办公类产品的落地,就会意识到这个动作的分量。文件浏览器不是一个"锦上添花"的功能…

作者头像 李华
网站建设 2026/10/20 17:40:18

会议纪要工具选型指南:实时转写与智能摘要的实操评测

1. 会议纪要工具选型的核心逻辑1.1 为什么大多数人的会议纪要都做不好开会这件事,几乎每个职场人都躲不掉。但会后能拿出一份让所有人满意的纪要,却是少数人才具备的能力。我观察过身边不少同事和朋友,发现大家在会议纪要这件事上踩的坑高度相…

作者头像 李华
网站建设 2026/10/20 17:40:07

MATLAB实现椭圆曲线Diffie-Hellman与希尔密码图像加密解密全流程

说实话,看到这个题目我就觉得有意思:用MATLAB写一个图像加密Demo,把椭圆曲线Diffie-Hellman(ECDH)和希尔密码(Hill Cipher)串起来,给一张普通图片做加密和解密。这个组合在论文里见过…

作者头像 李华
网站建设 2026/10/20 17:40:03

HALCON景深合成全解析:原理、实现与避坑指南

简介:一份基于Halcon与QT实现的景深合成完整方案,面向机器视觉开发者和自动化检测工程师,解决多焦距图像融合生成清晰深度数据的实际需求。该技术可提升产品检测、缺陷识别与精密装配中的对焦精度与测量稳定性。压缩包共6个文件、26KB&#x…

作者头像 李华