- 浏览: 188764 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
di1984HIT:
记录一下。嘿嘿
eclipse中关闭js报错的方法 -
di1984HIT:
谢谢,学习了
jdk输出带缩进格式xml的方法 -
雪狐狼:
为何,每次查询需要 构建datatable?
YUI DataTable 服务器端翻页与排序 -
lijunwyf41:
nd:"nd", // 表示已经发送请求的 ...
jqGrid <-- json --> spring,hibernate之服务器端分页,排序 -
yiyu:
最近不看YUI了,发现一个国产的前端框架,是金蝶出的,叫Ope ...
YUI 3 学习笔记(5)- Attribute类
最近做了一个以jqGrid实现的数据表格,与服务器端(spring + hibernate)以json格式交换数据,分页
和排序都在服务器端实现,现总结如下:
操作页面是这样的:
用户输入查询信息,按“检索”按钮,返回查询结果,表格可以翻页,排序。
当把jqGrid的属性datatype定义为function时,表格需要获取数据时(翻页,排序等),jqGrid就会调用
这个function,通过这种机制,就可以实现服务器端分页、排序。需要注意的是,这个function需要读取
数据并显式地调用addJSONData,addXMLData等去刷新表格,详情可以参看:
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#function
这个函数有一个参数,关于参数的定义我没有找到,但用firebug之类的工具可以看出包括如下的属性:
_search : (不清楚)
nd : (不清楚)
page : 当前页
rows : 每页记录数
sidx : sort index,排序字段名
sord : sort direction,排序方式:asc, desc
这样一来,我们就可以把这些数据发送到服务器端进行分页和排序。
以下是页面的html代码:
以下是jqGrid初始化的代码:
其中关键就是datatype为一function,在这个function中通过jQuery.ajax发送一个请求,获取数据,然后通过
addJSONData刷新表格数据。发送的数据包括postdata和用户输入的查询条件,其中postdata是jqGrid传递过来
的包含分页、排序信息的对象,jsonCondition是“检索”按钮中生成的包含查询条件的对象。
检索按钮中的处理如下:
其中array2Json是从网上找来的把jQuery的serializeArray生成的数组转成json的函数,我以前的文章里有,这里
就不重复了。
mergeObject是一个我自己写的拷贝一个对象的属性到另一对象的函数:
下面说下服务器端。
我用的spring的controller是直接接受json数据并以json格式返回数据的,这部分是延续以前的做法的,可以参见
我以前的文章:
jquery(1.3.2)<--json-->spring(3.0)
jquery<--json-->spring(3.0)之后台校验
我定义了一个对应jqGrid的postdata的类:
对于不同的查询页面,可以扩展这个类,定义包含该页面查询条件的类,本例中我定义了这样的类:
Controller的定义如下,其中接受的参数就是上面所说的CustomerSearchInfo这个类:
jqGrid对于json数据是有格式要求的(这个格式可以自定义),详情可以参见
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#json_data
当repeatitems为false时默认是这样的:
所以我还为服务器端的返回数据定义了一个类:
customerService.search(searchInfo)返回的就是这样一个类。service的代码如下:
其中计算了总页数,当前页,记录数,同时通过相应的setter方法进行赋值。
在dao层,就是利用hibernate的setFirstResult和setMaxResults读取当前页的记录,需要注意
的是,对于符合条件的总记录数需要使用Projections.rowCount()获得,所以我做了两个方法
search和count,前者是取得本次查询当前页的数据,后者是本次查询的记录总数,这两者的
查询条件是一样的,但前者需要加上排序信息,并且指定仅返回当前页的记录数,后者仅获取
记录条数(其实就是select count(*)),代码片段如下:
和排序都在服务器端实现,现总结如下:
操作页面是这样的:

用户输入查询信息,按“检索”按钮,返回查询结果,表格可以翻页,排序。
当把jqGrid的属性datatype定义为function时,表格需要获取数据时(翻页,排序等),jqGrid就会调用
这个function,通过这种机制,就可以实现服务器端分页、排序。需要注意的是,这个function需要读取
数据并显式地调用addJSONData,addXMLData等去刷新表格,详情可以参看:
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#function
这个函数有一个参数,关于参数的定义我没有找到,但用firebug之类的工具可以看出包括如下的属性:
_search : (不清楚)
nd : (不清楚)
page : 当前页
rows : 每页记录数
sidx : sort index,排序字段名
sord : sort direction,排序方式:asc, desc
这样一来,我们就可以把这些数据发送到服务器端进行分页和排序。
以下是页面的html代码:
<table width="95%"> <tr> <td> <table> <tr> <td> <form id="frmSearchCustomer"> <table> <tr> <td> 名称:<input type="text" name="name" /> アドレス:<input type="text" name="addr" /> </td> </tr> <tr> <td> 担当者:<input type="text" name="dandang" /> </td> </tr> </table> </form> </td> </tr> <tr> <td> <button id="search">检索</button> <button id="clear">清除条件</button> </td> </tr> </table> </td> </tr> <tr> <td> <table id="list"></table> <div id="pager"></div> </td> </tr> </table>
以下是jqGrid初始化的代码:
$("#list").jqGrid({ datatype : function(postdata) { postdata = mergeObject(jsonCondition, postdata); jQuery.ajax({ type : 'POST', contentType : 'application/json', url : ROOT_PATH + '/customer/search.do', data : JSON.stringify(postdata), dataType : 'json', success : function(resp) { if (resp.successed) { var thegrid = jQuery("#list")[0]; thegrid.addJSONData(resp.returnObject); } else { alert(resp.errors[0].message); } }, error : ajaxFailed }); }, height : '100%', rowNum : '10', jsonReader : { repeatitems: false }, colNames : ['顧客番号', '名称', 'アドレス', '担当者', '携帯', '電話①', '電話②'], colModel : [ {name:'id', index:'id', width:80}, {name:'name', index:'name', width:256}, {name:'addr', index:'addr', width:256}, {name:'dandang', index:'dandang', width:64}, {name:'mobile', index:'mobile', width:128}, {name:'phone1', index:'phone1', width:128}, {name:'phone2', index:'phone2', width:128}, ], pager : '#pager' });
其中关键就是datatype为一function,在这个function中通过jQuery.ajax发送一个请求,获取数据,然后通过
addJSONData刷新表格数据。发送的数据包括postdata和用户输入的查询条件,其中postdata是jqGrid传递过来
的包含分页、排序信息的对象,jsonCondition是“检索”按钮中生成的包含查询条件的对象。
检索按钮中的处理如下:
var jsonCondition = {}; function search() { jsonCondition = array2Json(jQuery("#frmSearchCustomer").serializeArray()); jQuery("#list").trigger("reloadGrid"); }
其中array2Json是从网上找来的把jQuery的serializeArray生成的数组转成json的函数,我以前的文章里有,这里
就不重复了。
mergeObject是一个我自己写的拷贝一个对象的属性到另一对象的函数:
function mergeObject(src, dest) { var i; for(i in src) { dest[i]=src[i]; } return dest; }
下面说下服务器端。
我用的spring的controller是直接接受json数据并以json格式返回数据的,这部分是延续以前的做法的,可以参见
我以前的文章:
jquery(1.3.2)<--json-->spring(3.0)
jquery<--json-->spring(3.0)之后台校验
我定义了一个对应jqGrid的postdata的类:
public class JQGridRequest { private String _search; private String nd; private int page; private int rows; private String sidx; private String sord; ... }
对于不同的查询页面,可以扩展这个类,定义包含该页面查询条件的类,本例中我定义了这样的类:
public class CustomerSearchInfo extends JQGridRequest { private String name; private String addr; private String dandang; ... }
Controller的定义如下,其中接受的参数就是上面所说的CustomerSearchInfo这个类:
@Controller @RequestMapping("/customer") public class CustomerController extends JSONController { private CustomerService customerService; ... @RequestMapping(value = "/search", method = RequestMethod.POST) @ResponseBody public JSONResponse search(@RequestBody CustomerSearchInfo searchInfo) { JQGridResponse data = customerService.search(searchInfo); return this.successed(data); } }
jqGrid对于json数据是有格式要求的(这个格式可以自定义),详情可以参见
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#json_data
当repeatitems为false时默认是这样的:
{ "total": "xxx", //总页数 "page": "yyy", //当前页 "records": "zzz", //本次查询的记录数 "rows" : [ {"id" :"1", "name" : "xxxx", "addr" : "xxxx", ...}, {"id" :"2", "name" : "xxxx", "addr" : "xxxx", ...}, ... ] }
所以我还为服务器端的返回数据定义了一个类:
public class JQGridResponse { private int total; //total pages private int page; //current page private int records; //total records private ArrayList<Object> rows; ... }
customerService.search(searchInfo)返回的就是这样一个类。service的代码如下:
其中计算了总页数,当前页,记录数,同时通过相应的setter方法进行赋值。
@Override @Transactional public JQGridResponse search(CustomerSearchInfo searchInfo) { JQGridResponse response = new JQGridResponse(); int count = baseInfoDao.count(searchInfo); double dCount = (double)count; double dRows = (double)searchInfo.getRows(); int total = (int)Math.ceil(dCount / dRows); //total page response.setTotal(total); int curPage = Math.min(total, searchInfo.getPage()); //current page response.setPage(curPage); searchInfo.setPage(curPage); //这是为了在dao中查询用的 ArrayList<Object> customers = new ArrayList<Object>(); //检索符合条件的数据(略) ... response.setRecords(customers.size()); response.setRows(customers); return response; }
在dao层,就是利用hibernate的setFirstResult和setMaxResults读取当前页的记录,需要注意
的是,对于符合条件的总记录数需要使用Projections.rowCount()获得,所以我做了两个方法
search和count,前者是取得本次查询当前页的数据,后者是本次查询的记录总数,这两者的
查询条件是一样的,但前者需要加上排序信息,并且指定仅返回当前页的记录数,后者仅获取
记录条数(其实就是select count(*)),代码片段如下:
public class CustomerBaseInfoDaoImpl implements CustomerBaseInfoDao { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } ... @Override public List<CustomerBaseInfo> search(CustomerSearchInfo searchInfo) { Session session = sessionFactory.getCurrentSession(); Criteria c = getSearchCriteria(session, searchInfo); //排序 String sortIdx = searchInfo.getSidx(); if (sortIdx.length() > 0) { if ("asc".equalsIgnoreCase(searchInfo.getSord())) { c.addOrder(Order.asc(sortIdx)); } else { c.addOrder(Order.desc(sortIdx)); } } c.setFirstResult((searchInfo.getPage() - 1) * searchInfo.getRows()); c.setMaxResults(searchInfo.getRows()); return (List<CustomerBaseInfo>)c.list(); } @Override public int count(CustomerSearchInfo searchInfo) { Session session = sessionFactory.getCurrentSession(); Criteria c = getSearchCriteria(session, searchInfo); c.setProjection(Projections.rowCount()); return ((Integer)c.list().get(0)).intValue(); } private Criteria getSearchCriteria(Session session, CustomerSearchInfo searchInfo) { Criteria c = session.createCriteria(CustomerBaseInfo.class); //检索条件 String name = searchInfo.getName(); if (name != null && name.trim().length() > 0) { c.add(Restrictions.ilike("name", "%" + name + "%")); } String addr = searchInfo.getAddr(); if (addr != null && addr.trim().length() > 0) { c.add(Restrictions.ilike("addr", "%" + addr + "%")); } String dandang = searchInfo.getDandang(); if (dandang != null && dandang.trim().length() > 0) { c.add(Restrictions.ilike("dandang", "%" + dandang + "%")); } return c; } }
发表评论
-
log4j日志中输出sessionID的方法
2015-05-13 19:51 2448在web应用中,如果使用log4j做日志输出时,如果要输出s ... -
jdk输出带缩进格式xml的方法
2011-11-04 16:28 5500jdk自己带有xml处理的功能,好像是用的xerces和xal ... -
JasperReport与spring集成的三种方式
2011-08-10 14:38 16444最近要用JasperReport,试 ... -
在javax.servlet.Filter里设置Paramter
2011-02-17 16:04 1279今天碰到一个冷僻的需求,需要在Filter里增加request ... -
WebDav的java客户端开发包:Jackrabbit
2011-01-25 16:39 4809上一篇帖子“WebDav的java客户端开发包:sardine ... -
WebDav的java客户端开发包:sardine
2011-01-24 13:27 6507最近需要对WebDav服务器进行操作,查找了一下,基于java ... -
读取xml文件时不做validation的方法
2010-06-21 11:49 1690今天遇到一个问题,我使用dom4j读取一个xml文件的内容,该 ... -
jquery<--json-->spring(3.0)之DataTables的服务器端翻页
2010-05-15 10:45 5377本文是jquery<--json--> ... -
jquery<--json-->spring(3.0)之后台校验
2010-05-05 17:27 4202前一段试了一下前台用jquery(1.3.2),后台用spri ... -
jquery(1.3.2)<--json-->spring(3.0)
2010-04-23 14:09 4220发现spring 3已经对ajax支持的很好了,前端可以只使用 ... -
使用HTML Parser获取需要HTTP认证的页面的方法
2010-04-09 13:48 1373HTML Parser(http://htmlparser.s ... -
使用javamail通过需要身份验证的smtp服务器发送邮件
2010-04-09 11:51 1779使用javamail发送邮件时,如果smtp服务器需要身份验证 ... -
Hibernate tools使用简介
2009-10-15 11:33 1519简单描述在Eclipse Java EE版中使用Hiberna ... -
关于ProcessBuilder执行dir命令报错
2009-05-15 10:09 2160今天无事,试一下ProcessBuilder,没想到这么一段简 ... -
YUI DataTable 服务器端翻页与排序
2009-01-23 14:45 3403这两天试用了一下YUI的DataTable,翻页和排序都在后台 ... -
使用json-lib的JSONObject.toBean( )时碰到的日期属性转换的问题
2009-01-22 16:21 2906今天碰到这样一个问题: 当前台以JSON格式向后台传递数据的 ... -
YUI + struts2实现基于JSON通讯的AJAX例子
2009-01-08 10:35 2462近来做了个小例子,前端使用YUI,后端使用struts2+sp ... -
Tiles与YUI LayoutManager的结合
2009-01-04 10:16 1582最近在学习YUI,深感功能全面,正在试探是否可以作为页面部分的 ...
相关推荐
挤塑板生产用造型机sw18_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip
轿厢式电梯sw12可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip
1、文件说明: Centos8操作系统thai-scalable-waree-fonts-0.6.5-1.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf thai-scalable-waree-fonts-0.6.5-1.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm
内容概要:本文详细探讨了永磁同步电机(PMSM)中二阶自抗扰控制(ADRC)的应用,特别是将速度环和电流环合并的设计。文中介绍了ADRC的核心组件,包括跟踪微分器(TD)、扩张状态观测器(ESO)和非线性状态误差反馈控制律(NLSEF),并通过具体的Python和Matlab代码展示了这些组件的工作原理。此外,文章讨论了线性和非线性ADRC在合并控制中的实现及其优缺点,并强调了在Simulink建模时需要注意的技术细节。通过这种方式,ADRC能够显著提高电机的动态性能和抗干扰能力,尤其在面对复杂工况时表现更为突出。 适合人群:从事电机控制系统设计的研究人员和技术工程师,尤其是对自抗扰控制感兴趣的读者。 使用场景及目标:适用于需要提高永磁同步电机控制精度和效率的实际工程项目,旨在帮助读者理解和掌握ADRC的基本原理及其在速度环和电流环合并控制中的应用。 其他说明:文章不仅提供了理论解释,还包括了大量的代码片段和仿真技巧,有助于读者在实践中验证和优化控制策略。
电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。
《毛毛虫的袜子》伴奏.mp3
内容概要:电子设计竞赛(电赛)是旨在培养学生创新能力、实践能力和团队合作精神的科技竞赛。文章详细介绍了电赛的目的、流程、参赛要求及常见问题解答。竞赛目的在于通过解决实际问题激发创新思维、提升实践技能、增强团队合作和促进学术交流。竞赛流程分为报名、准备、竞赛、评审和颁奖五个阶段。参赛要求包括团队组成(3-5名学生,可跨专业组队)、配备指导老师、选择符合规定的项目主题以及确保作品符合技术规范。常见问题解答涵盖参赛专业限制、所需准备材料、评审标准和培训指导等方面; 适合人群:对电子技术感兴趣并希望提升自身能力的大学生; 使用场景及目标:①为有意参赛的学生提供详细的参赛指南;②帮助学生了解竞赛流程和要求,提前做好充分准备; 阅读建议:本文为有意参加电赛的学生提供了全面的信息和指导,读者应重点关注竞赛流程、参赛要求及评审标准等内容,以便更好地准备竞赛。
NLTK 是一个广泛使用的 Python 库,专注于自然语言处理(NLP)。它提供了许多工具和算法来处理文本数据,例如分词、词性标注、句法分析等。然而,这些功能通常需要依赖大量的语言数据(如语料库、词典、预训练模型等),这些数据被统称为 NLTK 数据资源 。 主要内容: a. 语料库(Corpora) 这些是用于训练和测试 NLP 模型的文本数据集合。 示例:gutenberg(古登堡计划的书籍)、brown(布朗语料库)、reuters(路透社新闻语料库)等。 b. 词典与词汇资源(Lexical Resources) 包括词频表、同义词词典(如 WordNet)、停用词列表等。 示例:wordnet(WordNet 同义词数据库)、stopwords(多语言停用词列表)。 c. 预训练模型(Pre-trained Models) 包含一些常用的 NLP 模型,例如分词器、词性标注器、命名实体识别器等。 示例:punkt(用于句子分割的预训练模型)、averaged_perceptron_tagger(词性标注器)。 d. 其他资源 包括一些辅助工具和配置文件,用于支持 NLTK 的各种功能。
内容概要:本文介绍了Python爬虫的基础知识,包括定义、优势、基本流程、常用库以及注意事项。爬虫是一种自动抓取网页信息的程序,Python因其简洁的语法、强大的库支持和跨平台特性成为爬虫开发的理想选择。文章详细讲解了爬虫的基本流程:发送请求、解析内容、存储数据和异常处理,并列举了requests、BeautifulSoup、Scrapy、lxml等常用库的功能。最后给出一个简单示例演示爬取网页标题的过程,同时强调了遵守robots.txt协议、设置合理请求间隔、处理反爬虫机制等注意事项。; 适合人群:对Python爬虫感兴趣的初学者或有一定编程基础的技术人员。; 使用场景及目标:①了解爬虫的工作原理和应用场景;②掌握Python爬虫的基本开发流程和常用库的使用方法;③能够编写简单的爬虫程序,为后续的数据分析、机器学习等任务提供数据支持。; 阅读建议:读者应结合实际案例进行练习,在理解理论的同时注重实践操作,确保能灵活运用所学知识。
内容概要:本文详细介绍了基于西门子PLC博途V17和WinCC 7.5sp2的一套高效工程模板。博途部分利用多重背景技术和梯形图+SCL混合编程,极大提升了编程效率和维护简便性。WinCC部分通过结构变量和面板实例,简化了人机界面的组态工作。此外,模板还包括丰富的功能库如PID控制、语音报警、报表生成功能等,显著增强了系统的实用性和用户体验。 适合人群:自动化领域的工程师和技术人员,尤其是初学者和有一定经验但仍需提高效率的从业者。 使用场景及目标:适用于工业自动化项目的快速开发与部署,旨在减少重复劳动,提高开发效率,缩短项目周期。通过使用该模板,工程师能够更快地上手并掌握先进的编程技巧和组态方法。 其他说明:文中提供了具体的代码示例和实际应用场景,有助于读者更好地理解和应用这些技术。同时提醒用户注意版权和使用权限的问题。
工作簿7777.xlsx
立式插秧机sw16可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip
稳压罐sw16_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip
电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。
电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。
内容概要:文章详细介绍了拦截器(Interceptor)的工作机制及其在HTTP请求响应全流程中的作用,包括在请求到达目标处理器之前、处理器处理请求之后以及视图渲染之前执行特定操作。拦截器的应用广泛,如日志记录、权限控制、性能监控、请求参数处理和身份验证与授权等。文中还提供了创建拦截器的方法,可以通过实现`HandlerInterceptor`接口或继承`HandlerInterceptorAdapter`类来创建,并且展示了如何配置拦截器,将其添加到配置中以拦截所有请求,还可以通过`@Order`注解配置拦截器的执行顺序。多个拦截器按照配置顺序依次执行其`preHandler`、`postHandler`和`afterCompletion`方法,确保请求处理流程的有序性和灵活性。 适合人群:具有一定Java Web开发经验,尤其是熟悉Spring框架的开发者。 使用场景及目标:①理解拦截器在Web应用中的工作原理;②掌握如何创建和配置拦截器以实现特定功能;③学习如何利用拦截器实现如日志记录、权限控制等功能,提升Web应用的安全性和性能。 阅读建议:在学习过程中,应结合实际项目需求,理解每个拦截器方法的作用,并尝试在自己的项目中实现相应的拦截器,以加深对其工作机制的理解。
内容概要:本文详细介绍了如何使用Matlab进行预测不确定性的仿真,重点讲解了置信区间的计算方法及其可视化。文章通过具体的代码示例展示了如何计算区间覆盖率(PICP)和区间平均宽度百分比,并提供了多种优化技巧,如使用norminv函数计算正态分布分位数、动态计算标准差以及分位数回归等。此外,还分享了一些常见的错误和改进建议,帮助新手快速掌握这一技能。 适合人群:初学者和有一定编程基础的Matlab用户,特别是那些希望深入了解预测不确定性和置信区间计算的人。 使用场景及目标:① 学习如何使用Matlab进行预测不确定性的仿真;② 掌握置信区间的计算方法及其可视化;③ 提高预测模型的可靠性和准确性。 其他说明:文中提供的代码可以直接应用于实际数据,只需替换示例数据即可。同时,文中还提到了一些高级技巧,如动态标准差计算和分位数回归,可以帮助用户进一步优化预测模型。
内容概要:本文旨在帮助电子信息、自动化、通信等专业学生更好地理解和完成电子硬件课后习题。文章首先指出电子硬件课程的难度,特别是课后习题部分。接着详细介绍了四个主要方面的解题技巧:一是正确理解电路图,强调在分析电路时要先明确电路特性再进行计算;二是利用等效变换简化电路,通过戴维南定理等方法将复杂电路转化为简单结构;三是总结常考题型,如RC、RL电路分析、放大电路分析等,并给出解题关键词;四是强调动手实践与理论思考相结合,鼓励使用仿真软件和实际搭建电路来增强理解。最后提出学习建议,包括多画图、分类练习、与同学交流等,以提高学习效率。 适合人群:电子信息、自动化、通信等相关专业的学生,尤其是正在学习电子硬件课程的学生。 使用场景及目标:①帮助学生克服电子硬件课程中遇到的困难,特别是课后习题部分;②提高学生对电路分析、等效变换等基本概念的理解和应用能力;③培养学生的动手能力和解决实际问题的能力。 阅读建议:本文提供了丰富的解题技巧和学习建议,读者应结合自身学习情况,边读边思考,并尝试将文中提到的方法应用于实际练习中,以达到更好的学习效果。
内容概要:本文探讨了车载刷写架构中 ECU 收到相同 blockSequenceCounter 数据包的情况,基于 ISO14229 标准,详细解释了 UDS 诊断服务(特别是 34、36 和 37 服务)在 ECU 刷写过程中的作用。文章重点分析了 TransferData 服务(SID 0x36)的实现逻辑,包括 blockSequenceCounter 的状态管理和重复数据包处理机制,以确保数据传输的鲁棒性和协议合规性。通过合理的状态管理和计数器递增逻辑,避免了数据覆盖或丢失,并提高了 ECU 存储寿命。 适合人群:具有汽车电子相关背景的研发工程师和技术人员,尤其是从事 ECU 诊断刷写工作的专业人士。 使用场景及目标:①理解 UDS 诊断服务在 ECU 刷写中的具体应用,特别是 34、36 和 37 服务的作用;②掌握 blockSequenceCounter 的状态管理和重复数据包处理机制,确保数据传输的可靠性;③确保 ECU 刷写过程符合 ISO 14229 标准,提高系统鲁棒性和资源效率。 其他说明:文章提供了详细的测试用例设计,帮助开发者验证 ECU 对重复包的处理是否符合预期。同时强调了在重复包场景中确保无冗余写入操作的重要性,尤其是在 Flash 存储中避免擦写寿命损耗。此外,还提到了超时处理和错误恢复机制,以应对实际应用中的各种情况。
c语言奔跑的火柴人游戏源码.zip