里程表数据的算法
. R2 B9 \4 R% ]. F& K5 |+ H8 Q3 H5 ^4 S2 j$ P) V: l
. h/ z" o' @. v3 [0 ?* i/ X9 b
一、10进制和16进制
) ]: a0 U2 h" x: `# c r 在电子仪表的存储芯片中,一般因为存储次数的问题,存储的数据不是使用10进制,而是使用16进制的算法,十进制数字为0、1、2、3、4、5、6、7、8、9。16进制数字为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,其中A为10、B为11、C为12、D为13、E为14、F为15。
% g8 b6 B Z9 p' o! \/ {8 U, u# d 16进制和10进制中间的转换互算法其实比较简单:即把16进制的“百位”、“十位”、“个位”视为百位*256、十位*16、个位不变数相加的和就是10进制的数值。/ [+ a# B" p5 n5 L" f) ^
例一:16进制021换算成10进制为:6 C Y, X" ^9 V
百位:256×0=03 u4 W7 m9 b0 ] [- v
十位:2×16=32
4 f0 a% P5 D5 `8 G. f 个位:1不变=1
5 s' G: i' j/ a# p/ }, {" c, P1 z 0十32十1=339 z& P+ E, l% J
换算结果:10进制数值为33。
, Z' c! r+ b+ p, c5 H 例二:16进制C44换算成10进制数值:+ _3 [3 B$ K" D8 a
百位:C为12×256=3072/ }+ Y6 M4 _! z3 f. w* C
十位:4×16=64# c E4 F5 t7 t- M7 G5 A, ^. c* y
个位:4不变=42 ]) J) P, ^) d) {0 E* N! M
换算结果:10进制数值为3140( J' x& \9 r. `0 I
如10进制数值要换算成16进制,可用相反的方法计算,以10进制码1211为例:1211除以256的整数商为4,余187,商4为16进制的“百位”;余数187除以16的整数商为11,余11,商11位16进制的“十位”,即B,组成16进制为4BB。0 ^& N) H6 r7 k$ x: |. M7 h
二、反码与正码
! w$ @2 z# {+ s/ {( u在存储器中数据记录我们通常使用16进制的正码记录方法,如把12345(10进制)记录为:3039(16进制)。8 ~; Y" D1 R5 d% w. b1 C
但在汽车仪表中还有另一种记录方式:16进制反码,如把12345(10进制)记录为:CFC6(16进制反码)。有时也称反码为补码。
2 a) [# k( J3 |0 p 那么反码与正码怎么转换呢?我们看一下用16进制的计算:CFC6=FFFF-3039;
8 g5 I) E, k( x2 ~ 其实我们还可以用另一种更直接的简单转换方式,只要按下正、反码对照进行一位对一位的转换即可:- ~ }2 w* y5 L' M+ U# d
正码:0123456789ABCDEF, m- ^- F. M) s# Z
反码:FEDCBA9876543210
4 G) }$ \0 n$ h: T5 p4 C* ?0 Q | 三、数据高低位问题+ c5 u# D, q1 s& [8 t
由于CPU设计和存储器设计的差异,对于同一个16位的16进制数记录时可能有高位在前或低位在前的设计差异。
- f. U( O- C+ ?' _7 ? 如数据3039(16进制),在某些仪表中会记录为:3930。
( J3 Y* S2 {4 _0 j0 Y6 ?1 C在调表之前我们必需弄清,我们的仪表是用那一种数据记录方式,其中有4种可能,即:正码+高位在前,正码+低位在前,反码+高位在前,反码+低位在前。
6 p7 G3 I# a; _) J- O. F四、里程表算法1 y4 M, N, J8 i1 `4 N3 r- D) `
知道了以上几点后,我们学习几种车系的里程数据的算法,其他的车系里程算法虽然略有不同,但是可以作为参考:6 A0 L) B! f4 K
1、大众车系调表算法! _5 s* O0 M- I9 X
首先我们介绍一种在汽车仪表中最常见的里程数据编码方式,这种编码方式的算法是为了解决存储器的读写次数而设计出来的。使用这种算法的车型包括:大部分的奥迪、大众、奔驰、宝马,以及小部分的国产车型,如奇瑞。并且其他的相当一部分车型的里程算法也是由这种算法演变或改进而来的。
3 \, A9 K$ }0 V2 l* S如果我们在仪表的存储数据中看到这样的数据:$ F; O& N) w1 ^. X6 ~
3039 3039 3039 3039 3039 3039 3038 30388 E8 V* w& x6 {, ~$ J% N
一组数值很相近,连在一起〔有可能是8组,也有的是16组),这就是我们所要的里程数据。* d- {7 D% |' ?/ ]/ m. j
现在我们假设数据的高低位及正反码的问题已解决,已经把数据统一转为正码、高位在前,并且只讨论八组数据的情况,我们看几个例子:/ `6 q/ ~# [& D+ ?- T0 q% q
lkm:0001 0000 0000 0000 0000 0000 0000 0000' u5 {& y$ e; Y9 r4 u! R
2km:0001 0001 0000 0000 0000 0000 0000 0000% E& b' n2 M; N1 C" u7 \: K
3km:0001 0001 0001 0000 0000 0000 0000 0000
+ w s8 m+ d4 J8km:0001 0001 0001 0001 0001 0001 0001 0001
& y, ?! j) Q* a* ?9 b! k9km: 0002 0001 0001 0001 0001 0001 0001 00011 m+ v% E) `- T/ z5 V
10km:0002 0002 0001 0001 0001 0001 0001 0001" L+ u# |- x" ^, O, e
大家很快就看出来,里程数就是把全部的数据都加起来的结果,但在大部分的车型中是每跑2km记录1次数据的,这时候我们得出的数据应该都乘以2才是实际的里程数,如上数据那就分别是:2km,4km,6km,16km,18km,20km。
" o; A+ |7 |# v0 L# }, g+ e2、丰田车系的调表算法
. v, m7 x4 J% A$ r* e5 _8 U; V5 ]丰田车系的里程算法与大众的里程算法都是为了解决芯片擦写次数限制问题而产生的。
/ D, a& F. d8 \8 R% D在分析丰田算法前我们先介绍两个名词: f3 p; i# p9 M" I# f
字节:在16进制的数据中我们把两个连着的字符称为“字节”,如:FF,00,12,34等。
" q7 N# ?" r- Y( F c字:由连着的两个字节组成的数据称之为“双字节”或“字”,如:80FF,1032,7ABE等。- e% I3 I% ^+ L' f5 f# x+ j
在绝大部分的调表算法中都使用“字”作最小的计数单位。$ J4 l9 \4 @" @& ~" G- w
现在我们来看一组丰田车的里程数据:
) r0 S$ [& y1 U% N, H, o97486km记录为:8OFF FFFF FFFF FFFF 7A8B F6FF7A8B F6FF 7A8B F6FF
1 Z% n9 i3 d$ Y这组数据为丰田车的里程记录数据,数据分为两部分。前一部分由4个字组成。即我们看到的:80FF FFFF FFFF FFFF,这组数据记录了从0一4的里程数。* h; C5 d' n+ T1 M, M& j! f
如:0km FFFF FFFF FFFF FFFF7 z4 N& \4 l' t/ |
如:lkm 80FF FFFF FFFF FFFF; N, `( I+ y7 b8 M' i7 J# z2 U) Y2 y
如:2km 80FF 80FF FFFF FFFF
! ]2 i0 j$ ^& ?( k如:3km 80FF 80FF 80FF FFFF* E( n4 {8 f" M8 S3 w& r9 c! J
如:4km 80FF 80FF 80FF 80FF
8 u5 c' d7 b7 B2 }+ H- U9 {1 x即是有几个80FF就为几km。
* P7 ~# O% }" T o% [那么超过了4km是怎么记录的呢?) J+ ?- B, o! B; m
那就是后半部的数据了。在后半部的数据中我们看到了重复了3次的“7A8B F6FF”,这三组数据代表的数值都是一样的,只是为了提高数据的可靠性而重复记录了3次,在修改数据时我们必须把三组数据同时修改,且其数值都必须一样。, i) j! E* u2 l1 {$ u5 e0 V
现在我们来分析一下这组数据的含义。首先我们先看一下下面的这个数据转换表:" B1 |) S# K* ` [$ G
6789ABCDEF) ~3 S* g: r7 \; ?8 h
││││││││││ ; W! R- S) n2 W1 a# q% _& [0 |. J
9876543210
- G. p, d2 Q2 u9 p 对照上表我们可以把数据:7A8B F6FF转换为:8574 0900。7 ]( x; K8 h) s
在8574 0900这组数据中它们的排列方式为:[十位][个位][千位][百位][十万位][万; S* s8 N) M3 ]7 X7 \: K! y4 D7 L
位][千万位][百万位]。* N! [% H! @$ [3 y
我们将它们按我们日常的记数顺序重新排列一下,可得到:00097485。
g- G' K y4 i: b+ N- i 97485加上前面一个80FF代表的lkm,那么可得到公里数为97486km。
) W! h. f$ b! S @- P' `9 h/ J$ ` 为了让大家加深印象,我再举例儿个里程数据:, t; @# y5 i+ p6 o; c6 v5 b
80FF FFFF FFFF FFFF EF78 FFFF EF78 FFFF EF78 FFFF:8710+1=8711km
( z6 [7 M" ?; R1 w. `+ [ 80FF 80FF FFFF FFFF FFFF EFFF FFFF FFFF FFFF FFFF:10+2=12km5 D O/ X+ I0 V
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF:0+0=0km
3 @' V3 ~( R/ Z: m7 h4 v 80FF FFFF FFFF FFFF 669A E8FF 669A E8FF 669A E8FF:176599+1=176600km
3 ^ \6 k: t" _$ p5 S/ ~5 U/ X 80FF 80FF 80FF FFFF FFCF 69FF FFCF 69FF FFCF 69FF :963000+3=963003km
" i" g( w) T$ _+ C( U 80FF 80FF 80FF 80FF CAFF FFFF CAFT FFFF CAFF FFFF :35+4=39km
. L! v% {: v0 } ~8 D 注:
& {, W! \- B8 [! f" } ①在某些丰田车中以FF80代替80FF;" @) J, I9 `* G$ I9 u1 N( a
②在某些车中每个80FF代表2km;
4 d4 @& Z( ~/ \+ n# T ③在调表时建议大家可以把前半部数据都改为FFFF,只需修改后半部三组数据,可以简化计算。
. f! N0 ~( {' f, { 此算法适用车型:1997至2000年款丰田佳美、1998款至2000年凌志LS400、1996至2000款凌志ES300、1997至2000年款Gs300,以及部分其他车型。6 [' g: ^7 ~% O! [4 F
3.别克轿车仪表算法4 b( z7 t% l# Z5 |, ?4 \
例:芯片型号:25010 里程数:157388 km9 ^/ k t/ r- q5 U8 r2 h. L X
00000000 02 FC FF FF FF FF 00 FF FF FF FF FF 02 FC FF FF……
. A7 ~ }& W; W8 W9 ?# z 00000010 FF FF 00 FF FF FF FF FF 02 FC FF FF FF FF 00 FF……# [7 B3 O2 a: F
00000020 FF FF FF FF 22 2D 22 00 16 16 06 00 F5 F5 22 00…"-"……".. t; U2 ^6 w, S& J
00000030 EA F5 22 55 00 75 78 89 04 07 24 3D 01 40 19 23.."U.ux...$=.@.#
/ S8 a) d) t* L8 V- Y 00000040 00 00 91 00 00 00 00 00 00 00 00 00 00 00 00 00................
j" U3 `6 j- U; B4 w! }0 q 00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00.................: w- V7 }2 ^6 t& P$ j% v5 K& L0 m# K
00000060 00 00 00 00 00 00 00 00 00 00 00 00\'00 00 00 00.................8 x, A, A7 f' @2 {
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 78 83 50.............x.P
* K% Q& ^7 [. n6 s1 x8 j. h6 K 00000080 FF/ l% @7 T: H" e; X
数据重复3次。/ G3 P/ S2 H1 A5 h. t: ]
从地址0000开始到地址000B结束为第1次。- ]( s* A. t. {
从地址000C开始到地址0017结束为第2次。
4 J" P5 f+ b0 N f! I) t从地址0018开始到地址0023结束为第3次。
- Q3 Z' X( J5 G9 `其中02 FC×206为里程数:02FCH = 764D 764×206=157384 km。
+ |. S8 ~6 W7 M( X4 iFF FF FF FF 00 FF FF FF FF FF必须有一个00字节。
1 |) E0 e! A% }* v3 } b00字节数据位置的确定方法:公里数mod 206=XXX(第一个位置为0)6 p1 g/ V$ @: ]
这里XXX就是00的位置。在这个例子中XXX=4=157388 mod 206$ X+ ?' b2 F7 T4 S( ~) p! J& U0 I
(第一个位置为0)其他数据必须保持为FF
6 X4 [& n) z) V! e所以公里数为:157384+4=157388 km。
' b4 p1 u0 B% _' e+ A2 P2 ]( [' J(说明:mod表示取余数操作。5 mod 3=2。100 mod 33=1) . ?* c! {" m. h
) i* i% v5 ^% c9 N |