diseño de un scaner obd
TRANSCRIPT
-
5/28/2018 Diseo de un scaner OBD
1/150
DISEO Y REALIZACIN DE UN SISTEMA
ON BOARD DIAGNOSTICS (OBDII)
ALUMNO: OSCAR RAYO MANSILLA
DIRECTOR: JORDI SELLARS GONZLEZ
4 DE JUNIO DE 2009
-
5/28/2018 Diseo de un scaner OBD
2/150
2
-
5/28/2018 Diseo de un scaner OBD
3/150
3
NDICE
. 1.1.
Ja 5
1.2. A..61.3. Ob..101.4. Aa 111.5. D a 12
1.5.1. D ba aa..12
1.5.2. D ba a...13
.
2.1. Ma aa14
2.2. R a..16
2.3. D a.21
2.4. D aa JDM2......25
2.5. Ma ..29
2.6. D a aa ba C++37
2.7. D a aa ba JAVA.40
2.8. D a aa a aa JAVA.....46
-
5/28/2018 Diseo de un scaner OBD
4/150
4
.
3.1. b a.52
3.2. Vaa .52
3.3. D a.54
3.4. Aa 66
.
4.1. Pa aba67
4.2. La aa68
4.3. P..70
4.4. Ob a71
4.5. C.71
4.6. Ma a..72
.
.
-
5/28/2018 Diseo de un scaner OBD
5/150
5
1. I
1.1. Ja
La a a a a a a
aa a b aa a
a a.
Na a aa aaba
a a aa a aba
, a a
aa aa a aa, ab aa
a a aa ba a a. E b a
a aa a aa a a aa a a a a a ,
aa a .
E aa a a aa a a a
a a a aba
aa, a b a a a baa a
ba a a a aa aa OBDII,
b a a a a aa a a
a , aa a a a.
E b , a
a a ab a
a a a a a a ab, a,
aa, a aab a aa.
-
5/28/2018 Diseo de un scaner OBD
6/150
6
1.2. A
OBD ( ) a a a b
( a). Aa a OBDII (Ea U), EOBD
(Ea), JOBD (Ja) a aa a
. OBD II a abaa O Ba
Da (Da Ab) II, a a a
a aaab ab Ea
U Aa. La aaa aa a b
aa aa a a aa ab
aa a a
aa a . Caa a a a
a aa a a a. S a
ba a aa, a OBD II a a aa aa
a aa aa a .
La aa aa a a a "C E"
"S E S". E a ab aa a a
b a aa aa aa a a
ba. E Ea U Aa, aa
a aa bb a a a 1996 b a
a OBD II, a a aa a a a 1997, Ea a a a 2001 ba aa
a EOBD. A, a
a a OBD II.
P a a a aa , OBD I?
OBD I a a a OBD baba a a
aa a a a
a. Oba a a 1991, a OBD I a a a
aba a aa a ,
a aba aa .
Y a, EOBD?
EOBD a abaa Ea O Ba Da (Da a
B E), a aa a OBD II. Ua a a
a a aa . S ba, EOBD a a OBD II a a "aa" a aa a
-
5/28/2018 Diseo de un scaner OBD
7/150
7
aa baa a a ,
aaa a a ab a. E
a a aa aa aa
.
T a a a a a aba, , a a a a a a a a
a , aa a
aba a a.
L aba :
01S a aa a a (ECU) a a aa a.
02Ma aa F Fa Daa, , aa a a a aaa a ECU.
03La b a a a a a (DTC).
04S a aa ba aaa (DTC) a F Fa Daa.
0Ma a a a a a aa a aa a ECU.
0S a aa b a aa aECU a a . E a a
, aa aa .
0S a aa a a a a a. E a a
aa , ba a a
a aa a a ba
, a a aa a a
ba.
S a a: bb, a
, a .
E a a a 01, 03 04, a
a 01 60 PID ,
aba a aa.
-
5/28/2018 Diseo de un scaner OBD
8/150
8
Aa a a aa a b aa
a a ab a a OBDII. E
aa a, a a a a
a abaa a aa, , a
aa a a ba a a.
C a a aa SaMa, a
a a a a a a aa
:
-
5/28/2018 Diseo de un scaner OBD
9/150
9
Tab a a SaT., a a a
a aa a a
a:
E aa a aa abaa a
ELM327, , a PC
. E a a b
a, a baa . A a
a :
Ia ELM327
-
5/28/2018 Diseo de un scaner OBD
10/150
10
Ia ELM327 Ia ELM327 B
E a a , a a aa b,
a a a OBDII .
1.3. Ob
E abaa a a a a a
aa a a, a a a
a b a a aaaa aa a a
a, a a OBDII, a b a,
aba a a
. Ma a a ba a OBDII b
a a a a a a a aaa,
a a Sa Aaa I (SAE) a Oaa
Iaa aa a Eaaa (ISO). A a a
a aa b baa ab
a :
C a a ab a aa a(ECU) a a OBDII.
C aa a aa ab a a aa aaa a a JAVA a a
aa aa.
-
5/28/2018 Diseo de un scaner OBD
11/150
11
Raa a aa a a a a a a a.
Da a a b a , ba a a a aba
a .
1.4. Aa
E aa a a a a
a a a a ba OBDII, a
a aa aa a a a aa a b aa.
E a a a a aa a a
a aa a a (ECU), a
a a a USB a a. A a a,
a aa a a a ba. M
a a aa
, a, a a aa aaa JAVA
, a, a a a aa a a
, a L a
aaa.
Paa aa aa aa a a a
a a a a aa , ,
aaa a a b PCB
aa a b a a aa .
Ea a aba ab a a a aa
aa a, a aa a
a a a a a a a a.
P a a a aa a a a,
a aa a a aa b
a, a aa aa ba
aa aa a ba a a a a aa
aa . E aa a
aaa a a a a
a b a a
a.
-
5/28/2018 Diseo de un scaner OBD
12/150
12
1.5. D a
E a a a a
aba a aa a a a
a aa a a OBDII, aa
a aab a a abaa b a
a a. P a a
a a a a a :
La a ba aa a, a a a aa a
a (ECU), USB a a.
La a ba a, a a aa a PC a a a a
a aa b a a USB.
1.5.1 D ba aa (M a)
Paa a a a a b
a , a a
aa a a a a aa a.
Ea a a a
(PIC18F2550) aa a a a
, , a a b
USB a a a a ECU.
E b a a OBDII a 4 b
aa a, SAEJ1850PWM, ISO 9141/14230, J1850 VPW, ISO 15765 (CAN).
Paa a aa a a
a a a aaa a a, a a
a aa aba , a a a
aa a aa .
O a a a aa a a ab
aa aa a a ECU a a a a
a ba, a a aa a
aa , a a a
aa ab.
-
5/28/2018 Diseo de un scaner OBD
13/150
13
1.5.2 D ba a (Ia Va)
Paa aa a aa a a
a b a a , b aa a
aa aaa a a b a. C
b a aa a a aa a a a, aa a
a aa, aa a (SaT),
a a C++. A a b a
a a ba a aa a a a ECU,
a aa ba
ba a a a ba b .
Db a b aa a a JAVA, a
a ab aba a aaa, aaa a aa aa a a a
aa a, a a aa aa ba
a a a a a JAVA.
Paa a a ab b a a a ba
RXTX ba aa aa aa a a
, a a API Jaa a
a b.
Ua ab a Jaa, a aaa a a aaa
a a aa a.
E b aa a , a a a a
a, aa a aa:
O aa a a a.
O aa a a aa .
Raa a a aaa aaa a a.
Raa a a a a aa , , a, aa , .
D a a a a a PC a.
-
5/28/2018 Diseo de un scaner OBD
14/150
14
2. D
2.1. Ma aa
Da a a a a a a
a a aa aaa a b, a ab
a a aa a ba b aa
a a , a a a a aa
aa aaa a a
a a a a a.
E a a a a a
aa. E a a a a a a, , aa, a
a b b a , a a a
ba a a. E aaa ab aa
aa b ALLPAa a a OBDDa.
a ab a a aaa ELM327, a
aa a b a, a ab
, a ab a aa
aa aa a a a a baa
PIC18F2550.
E a a ba aa
a a b aa a. D a
aa a aaa aa (a PIC18F2550
USB), a a aa
baa aa a aa a. D a,
a baa aa a .
Ua a , b a
a a a (PIC18F2550)
PC, a ba a
a a a b, ,
aa a aa a aa aa
a a a a a
a.
E a aa a aa SaT.,
a , aa
. E aa a , aa , a ba aa
a a ba a a a a aa a
a PC aa a aa a , a a .
-
5/28/2018 Diseo de un scaner OBD
15/150
15
A a aa a a a
a a a aa a
a a a a. Da PIC18F2550 aba
a aa M, b a aa
, a a , a a a aa a
aa aa USB Fa aa, a ba a aa
a a a a aa
aa a. La a b a a aa a a
a, OBDDa., ab a a, a
INF, aa W XP Va a
ba. Tab aa a a, L, a a a
a b L a a a.
P a, a a a a a
a a a , a a a a
a , , a a aa
aa a. Ua a a, a
baa C++, aa ba a a
a ba a, a a a aa
aa .
Ua aa a a a a b a a a aaa Jaa. Ba aa
ba a a a a C++, a
Jaa. E a a a a
a Jaa aa a S, a
a S M, a aa a aaa
aa, b, a aaa
a ab a a. Ea aa a
a a RXTX a aa a aa
a Jaa.
C b a aa a a
aa a b a a, a
a a . E a ba a a aaa
a aa a aa a
a a aa, a a a aa
a a aba b a a a
b a aa a a , , a a ab, a.
-
5/28/2018 Diseo de un scaner OBD
16/150
16
2.1 R a
Paa aa a a
a a a a a a aa,
a a a a a .
Paa a a a a a b OBDDa., b
aa, a, a PCB a
aa a. Paaa ab a a a b ELM
E, a aa (ELM327DS.
ELM320DS.), b aba a aa a a a
aa a (ECU) a a
a a. E aa ELM327DS,
a a b a b
a a a ELM327 a ab a a
a , a a a ab
a a a ba a, ELM327.
E a b a
ELM327 a, a, a a a a
a aa :
-
5/28/2018 Diseo de un scaner OBD
17/150
17
-
5/28/2018 Diseo de un scaner OBD
18/150
18
A a a aa ELM
E, a a a, a a
ELM327, a a a a a, a aa
aa a a a
a OBDII:
Da a OBD a RS232
-
5/28/2018 Diseo de un scaner OBD
19/150
19
Paa aa a ba a
a a a SaT., a a a
. E a a
aa a DEVC++, ab aa
ba a a a
a.
Ua a aa a a aaa JAVA a
a, a a b a b S M
aa a a JDK 6 Ua 13, a a a a
aa aa aa a aaa E
3.2.2, aa aa
a a a .
U a ab a a a aa
RXTX., a a a ba RXTX.a,
a a JAVA aa aa . E a b
a a a
, a a a aa
a .
-
5/28/2018 Diseo de un scaner OBD
20/150
20
P a aa a
a a a OBDII (O Ba Da II), a
a a a a b Wa,
(OBDII PID), a a a aa
a a a, a (ASCII),
aa a aa a a a aa.
Da aa ASCII
Da a a aaa OBD PID
-
5/28/2018 Diseo de un scaner OBD
21/150
21
2.3. D a
La a a a a
a a aaa aa a PC a aa
a . E aaa a a a a,
ab USB a PC , ab OBDII a a
aa a a
. E ab b a, a a a
, aba OBDII, a
a aa, aab a
a aba a a a ba a a.
Cab OBDII a DB9 ba Cab USB AB
E a aba aa a a
OBDII DB9:
() ()
(J2850 BUS+) 2 7
(Ca G) 4 1+2
(Sa G) 5 1+2
(CAN H J2284) 6 3
(ISO 91412 K L) 7 4
(J2850 BUS ) 10 6
(CAN L J2284) 14 5
(ISO 91412 L L) 15 8
(Ba P) 16 9
-
5/28/2018 Diseo de un scaner OBD
22/150
22
P a aba a a aba a aba . Paa
a a a a aaa a
a, a a
aa PCB a a a a b aa:
-
5/28/2018 Diseo de un scaner OBD
23/150
23
E aaa a a ba a 4 a
a aa a, a a a a a
aa a a aba a a
, a a a a 2004, Ea, a aa aba
a a a CAN B. Caa
aba EE.UU. a a 1996, ba a
OBD2, Ea a a a 2001, ab b a
aa . La a OBD2 a
a :
ISO 9141/14230 J1850 PWM J1850 VPW ISO 15765 (CAN)
VPW (Vaab P W) a Ga M,
a PWM (P W Ma) a F. ISO 9141
a aa ISO 14230 (AKA K 2000) a aa
a aba. T a a
2007/2008 a CAN B. La a
a OBD2 16 aa a :
S a aba
.
E ISO 9141/14230 a 6 15, J1850 PWM
a 2 10, J1850 VPW a 2, ISO
15765 (CAN), 6 14. T a
aa 4 5 (aa a aa a a),
16 (+12V).
-
5/28/2018 Diseo de un scaner OBD
24/150
24
Paa a aba a
b a a a a. E a a
ba a a a:
E a ba a a PIC18F2455,
a a a a a PIC18F2550,
a ab a aa a a. E
aa a
a a a , , b a
a USB a a, a a a
a a, a a a
ba.
La a a aa CAN BUS,
a MCP2515 MCP2551, a MC33290 aa
ISO9141/14230 Q3, J1850 VPW a MC33390 a
M (Q2 Pa Q1 Na) a b J1850PWM
aa PIC18F2550 a a R4 R5 a a
a a a aa PWM.
-
5/28/2018 Diseo de un scaner OBD
25/150
25
2.4 D aa JDM2
D a a a b
a a a PIC18F2550,
a aa a a a aa,
a a a aa aa
ab ICSP (IC Sa Pa). E
aa, aa JDM2, a a a
a a ICSP a
a M aa a
a aba. E a aa
a a b a a
a:
-
5/28/2018 Diseo de un scaner OBD
26/150
26
E a aa baa a aa aa
, a:
Da aa JDM2 a
Da aa JDM2 a (a aa)
-
5/28/2018 Diseo de un scaner OBD
27/150
27
A aa a a a a PC a
, a a a a a
a a a . La aa aa aa
a PICP D. Pa a a
a; a a a a a
a aa a a aa.
S aa a a aa
a:
L aa a a a aa JDM2 a a ICSP, aa a PIC. V a
a (MCLR, PGC PGD), ab a aa
aa a 8 19 aa aa, 20 aa +5 V
a. E 26 (PGM), a aa a
a a a a aa L
Va ICSP, a aa HVa ICSP.
-
5/28/2018 Diseo de un scaner OBD
28/150
28
La aaa aa a aa a :
E a a aba aa
a b a a b a.
A a ab a , b a
a a aa. P a
ab a
DB9. Tab aa a , a a a a a a a aa aaa
aa.
-
5/28/2018 Diseo de un scaner OBD
29/150
29
2.5 Ma
Ua aba a a a a ba
a a a , b aba
a a a aba
a, a a
ba a aa a. S b a
a aba a a aaa
a a a a J1850PWM.
Paa aa a a a a
aaa aa 1GH, aa aaba a
a a, a a a a a
a aa a b aaa.
E a :
Ra a aa aa a a 2 (BUS+) OBDII
Ra aa aa a a 10 (BUS) OBDII
-
5/28/2018 Diseo de un scaner OBD
30/150
30
Paa a a aa a a
a a aa a 1850PWM. E
a a, BUS+ BUS, aaa
a a a a (PWM) a
a b. E aa b a a 24
a a a a:
U b=1, a a a 8 .
U b=0, a a a 16 .
E BUS+ a a a a 5. E BUS a a a a 0.
P a a BUS+ a a 0 V
BUS a 5 V, a a a a b b a aba
a a a,
a a a a .
Ha a a a a a a a
BUS+ a ba , a a BUS
aa a a 0 V, BUS+ a a a a 5 V,
4,4 V aaa. A a
ba aa aa a a aaa a
a SAEJ1850PWM, a a
, a a a a
a a a a.
-
5/28/2018 Diseo de un scaner OBD
31/150
31
E a ba aa aa a
M Q1 Q2 (Q2 Pa Q1 Na) a
a R7 R6. Pa b a
a , aba M a PNP
NPN (PNP>2N3906 NPN>2N3904) a a R6 R7 22
a 2K7 . A a a a a
ba a 1K.
P a a a aa a:
-
5/28/2018 Diseo de un scaner OBD
32/150
32
Db a a ba a aa aa
a a a a a aa aa.
S a J1850 PWM a aa :
A a a a aaa
a a a a aa a :
SOF: Sa a Ha F: S aa a a 3 b
a:
E b a a a a aaa a a, SAE J2178 b
aba a aa, a aa b
a. L 8 b a a:
BIT 7 6 5 4 3 2 1 0
ID P P P H K Y Z Z
L a (7, 6 5) a a a a
a a:
B 7 B 6 B 5
0 0 0 0 Pa a
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7 Pa a
-
5/28/2018 Diseo de un scaner OBD
33/150
33
E b 4 (H) a a aba 3 b :
H=0 T b H=1 U b
E b 3 (K) a a "IFa " ? :
K=0 R K=1 N
E b 2 (Y) a a aa a a:
Y=0 Fa Y=1 Fa
L b 0 1 (Z, Z) a K Y aa
a:
M. KKYZ Ra(K) D(Y) T a
0 0000 R Fa F
1 0001 R Fa Baa
2 0010 R Fa F Q
3 0011 R Fa F Ra
4 0100 R Fa N a N
5 0101 R Fa RaMFG
6 0110 R Fa RaSAE
7 0111 N Fa RaMFG
8 1000 N Fa F Ca/Sa
9 1001 N Fa F R/Q
10 1010 N Fa FE.Ca/Sa
11 1011 N Fa F E. R/Q
12 1100 N Fa N a N
13 1101 N Fa RaMFG
14 1110 N Fa N b
15 1111 N Fa RaMFG
-
5/28/2018 Diseo de un scaner OBD
34/150
34
E b a a a a a a a a aa (ECU).
E b a a a a a a a a a aa .
Daa F: E a a a a a aECU.
CRC: C aa a a aa.C a a a a a
ba a a Ha F a b a
aa. A a a a aa a aba
a a, a a ATH1, a
a a a aba (Ha) a a aa,
ba a a aa a aba aa
a 6A 61 F1. E a a (J2178), aba
a aba a a aa a a aa
a J1850PWM, ab aa a a a
b aba a a, a E4 10 F1.
La aba 6A 61 F1 a 061 (01100001) b
a a 3, b aba, a 2, a a b a aba, , 06A.
La aba E4 10 F1 a 0E4 (11100100) b
a a 7 (a), b aba, a 4,
a a .
E aa a aba a aba a
ATSH, aa a a a a
a, a a a a aba
a, a a aa a .
Ua a (H W H E),
aa aba b a a aba
, a ba a a
a a.
-
5/28/2018 Diseo de un scaner OBD
35/150
35
E a aa ba a
aba a, aa aba a
aa aa, a a a
a a a.
:103C70000350E66EE66A00010028BC6F000E0120CA:103C8000BD6FBCC0E6FFBDC0E6FF040E0024BE6FE2
:103C9000000E0120BF6FBEC0E6FFBFC0E6FFDDEC37
:103CA0001EF046E90028E96E000E0120EA6E6A0E59
:103CB000EF6E020E0024E96E000E0120EA6E610E26
:103CC000EF6E030E0024E96E000E0120EA6EF10E85
:103CD000EF6E0001030EBC6F00EBE9FF01EBEAFFA2
:103CE000BC51EF2642E9E7CFD9FF1200D9CFE6FF5A
A aa b ab aa
aa a aa a ababa, a
:
:103C70000350E66EE66A00010028BC6F000E0120CA
:103C8000BD6FBCC0E6FFBDC0E6FF040E0024BE6FE2
:103C9000000E0120BF6FBEC0E6FFBFC0E6FFDDEC37
:103CA0001EF046E90028E96E000E0120EA6EE40EBA
:103CB000EF6E020E0024E96E000E0120EA6E100E77
:103CC000EF6E030E0024E96E000E0120EA6EF10E85
:103CD000EF6E0001030EBC6F00EBE9FF01EBEAFFA2
:103CE000BC51EF2642E9E7CFD9FF1200D9CFE6FF5A
C a a a a b
a a aa a . Ua aaa
a a a a a a a aa
aba ba. E a a a a
a a aa.
La aa aa a :
E4 10 F1 01 000A
Y a:C4 F1 10 7F 0101 00 00 11 41
E a a aa 7F 01, a a aa, ,
J2178 a a aa a a aa a
a b aba ,
M 01.
-
5/28/2018 Diseo de un scaner OBD
36/150
36
E a OBDII a a aba, 01,
03, 07, 04, 09, 22 baa . Caa
a a a a a aa a ECU. E
a a aa 01.
Caa a a a PID (Paa ID), a 01 a 00, a
a. E a aa a a ECU a
PID a PID a
a 1 a 20.
D a a J2178 a a
01 b a aa bab
aa a 22. E a a a a
22 a a aa aa 01, a aa a a
aa ( a a a), aa, a
a a aa.
-
5/28/2018 Diseo de un scaner OBD
37/150
37
2.6 D a aa ba C++
Haa aa a a a aa a a a aa a
, a a a ab a a
a a a aba. E a
a a aba a a a b SaT., a
. Ua a aa DC++
, a baa C++, aa
aba a ab a a a a
. E a aa a a aaba a a
aa aa aa a a PIC. Ta aa aa
a aa ba, a a a , a
a aba a a a aab aaba
aa a, a baa a
aa a aa ba. Ua a a a
aab a a b ,
aa a aba . D ab a
a a , aa a a aab
b aa a a ba, a a a a a
aa a a a a a a
aa a aa. Fa aa ba a
aa a a a a PIC (a, 0100, ...) b a a b a aa a. A a
aa aa ba:
-
5/28/2018 Diseo de un scaner OBD
38/150
38
-
5/28/2018 Diseo de un scaner OBD
39/150
39
E aa a a ba a ba, ba aa
aa aa , a a a a a a
a aa a, a ab a aa a ba
a a a, aa abaa W. La aa :
a(): Aaa . (): Caa a ba ab . (): Daa a ba a . a_(): L . _(): Ab .
-
5/28/2018 Diseo de un scaner OBD
40/150
40
_(): Ca . _a(): Eb .
2.7. D a aa ba JAVA
E a a aba aa ba a
a a JAVA, a a a aa a aaa
a a a a a .
C a a IDE aa aa Jaa
E. Paa a a aba aaa a a API aa aaa PC, ,
a aaab JDKJRE aa S
M, a ba a aa.
Paa a ba aaa RXTX, b
.RXTX., a a a a Jaa a aaa aa
a aa, a a
a a a, a a W, a a S
a API aa (Jaa), a aa a
a, a a API ba aa RXTX.
Daa
a RXTX, b a RXTX.a a a :\A
aa\Jaa\\b\, Sa. Paa. :\A
aa\Jaa\\b. S a W a L a
a a . E L b a
RXTX.a //b///b/, a bPaa. bSa. a a //b///b/386 a
32 b. C a a a ba b
aa a.
RXTX. a b a a a ba
, a a a aa.
-
5/28/2018 Diseo de un scaner OBD
41/150
41
E aa ba ab a a :
importgnu.io.CommPortIdentifier;
importgnu.io.NoSuchPortException;
importgnu.io.PortInUseException;
importgnu.io.SerialPort;
importgnu.io.UnsupportedCommOperationException;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.util.Date;
importjava.util.Enumeration;
publicclassPrincipal {
CommPortIdentifier idpuerto;
String NombrePuerto;
String ordre="atz";
String stringRebut;
SerialPort port;
OutputStream DadesEscriu;
InputStream FluxDades;
Date temps,temps2;StringBuffer respuesta;
publicPrincipal(){}
publicvoidconectar(){
intj=0;
for(Enumeration i=CommPortIdentifier.getPortIdentifiers();i.hasMoreElements();){
idpuerto= (CommPortIdentifier) i.nextElement();
System.out.print(j++ +". " + idpuerto.getName()+"\n");
//Se examinan todos los puertos disponibles
}
try{
idpuerto.getPortIdentifier("COM2");
port= ( SerialPort )idpuerto.open("VisualOBD",2000);
port.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
//Se abre el puerto seleccionado
} catch(PortInUseException e) {
e.printStackTrace();
System.out.println("Puerto en uso.");
} catch(NoSuchPortException e) {
e.printStackTrace();
System.out.println(e);
} catch(UnsupportedCommOperationException e) {
e.printStackTrace();
System.out.println(e);}
}
-
5/28/2018 Diseo de un scaner OBD
42/150
42
publicvoidenviar(){
temps=newDate();
intdata;
try{
DadesEscriu= port.getOutputStream();
for(inti=0;i
-
5/28/2018 Diseo de un scaner OBD
43/150
43
Ea aa aa a C++, a
a a a:
b a a(): M a a aa. b Ca(): Eab a a. b Ea(): Eb a aa a a a . b b(): L a aa a ba . Pb (): M aa a a aa a a a
.
Ta JAVA C++, aa a aa a ba
aa a a a
ASCII, a a a ba aa.
U aa a aa a :
Ca a a: a> aa ASCII:97,116,122E a aa a .
S aa a a aa a aa a aa:a\> ASCII:97,116,122,13 () a a
SaP a a a .
Taa ba a a() a aSaP:
97,116,122,13,10,69,76,77,51,50,55,32,118,49,46,49,32,99,111,109,112,
97,116,105,98,108,101,13,10,62,1
Eaa a aa ASCII: aELM327 1.1 ab
E (1), a b a, a aa ab a aa a aa, a
aa a aa 62 ( a a >).
-
5/28/2018 Diseo de un scaner OBD
44/150
44
Ca a a: 01 0C> aa ASCII:48,49,48,67E a aa a a aa a
(ECU), a aa (), a .
S aa a a aa a aa a aa:01 0C\> ASCII: 48,49,48,67,13 () a aSaP a a a .
P a a a a a b a a a a a ECU a aa a a J1850
PWM:
SOF: Sa O Fa
Ha F: 6A 61 F1
Daa F: 01 0C (Ca a a a)
CRC: 0A
EOF: E O Fa
La ECU a a aa a a a aaaa a :
6A F1 61 41 0C 0B 88 0A > Ra ECU
01 0C > Ra
6A F1 61 41 0C 0B 88 0A Ia
S ba a a aa a a aa a
a
Taa ba a a() a aSaP:
48,49,48,67,13,10,54,65,70,49,54,49,52,49,48,67,48,66,56,56,48,65,13,10,62,1
-
5/28/2018 Diseo de un scaner OBD
45/150
45
P a a a ba a :01 0C: Ca
6A F1 61: Caba a aa(Ea a,
a, , ..)
41 0C: Ca a a a a
a 40 a 01, a 41 0C.
0B 88: E a a aa aa a . S
OBD P a a, aa a a
a a 11 136, aa a a
( )( ) ( )738
4
13625611
4
256=
+=
+ BA, b a
a a.
0A: C aa a a aa (CRC).
-
5/28/2018 Diseo de un scaner OBD
46/150
46
2.5. D a aa aa aa JAVA
E a a aa a
aaa a a a a a aa
aa, aa a a a a aaa
a aba aa ba a
a a a , a a
aa a a JAVA, a a a aa
a ba a aba b a a
a b a aa a a .
E a a ab a aaa a
a USB RS232, a a a JAVA,
b a aa aa a a a a
ba aa (RXTX.a), b a aa
aba aaa a a, a ba a a
b RXTX.
Ba aa aaa b a:
E a aa a a aa, a aa a a a,
aa a / a a
a a a a b a a.
E a aa a a a ,
aa aa a .
Ea aa aa a a aa
a a ECU .
Ea a ba aa a a a
, a a a b a
a a aa a a ECU.
Ea a aaa a
, a a a aa,a, , aa a abb, .
-
5/28/2018 Diseo de un scaner OBD
47/150
47
Paa aa a a a aa aa:
aa a, aa aa a. Caa aa a
aa a a a
a aa. A a a a a
aa aa:
1. E a aaa a a a aa a aba a aa a a. S b
a a a b a, aa aa aa
b a a a a a a
b a a a aa . E a aa
a a a:
E a aaa aa ab a aa a : velocidad, dataBits, stopBits, paridad,nombrePuerto, protocolo.
C a aa aa a , a aa a aa ba.
Ca a a a TXT, b aa a aa a. Aa a aa a a a a a a b a aa a, a aa .
Caa a aa CAN B.
2. E a aaa a a aaa a a aa a a , a a a. O a aaa aba a aa a, a a ab aa aa . Ea aa a a a CaDC, a a a aa aa a a a
a a aa a.
-
5/28/2018 Diseo de un scaner OBD
48/150
48
Ea aa aa a a a aa aa a a a aa aa a a ab a aa. Ca a a a : Ga a aa a a
a a aa a a a aba aa, a a a a a aa. Ea a a a a a aaa a a ECU. S a a aa aaa a a a a , a aa,a, , aa a abb, . Ga a a aaa a b a a a a a. Pa aaa a a aa a. A aa a ba .
P aa, a a a a.
E a aa a a a aa a aCaC, a a aaa a a a aaa a a .Ea a a a a Rab R(), a a a a a a , a ba a a aa aaa a.Oa a a a a a
CaM, a a aa a a a a a a a aa .P a a aa abaa 3 :
S a a a a aa aa a a a.
Ea a a b a aa a aa.
Ra a aaa a a b () a aCaC.
-
5/28/2018 Diseo de un scaner OBD
49/150
49
Ca a ba a b a a a aa aa, aa JAVA b a a a a aa a, b Waba a a b aba aa aaa, b L b a a.
S b L aa aaaba aba a a, a a a aa aba a ba.D a ba a a ba aaRXTX.a a a aa aba a a a a abaa. E ba aba () a a CaC(), a a a a SaP a aa a .Oba a a a a aa:publicvoidrun(){
booleandatos=false;
String tramaRecibida;
Thread thisThread = Thread.currentThread();
while(hilo== thisThread){
charz;
intlongitudTrama=0;
intreb=0;
try{
datosRecibidos= port.getInputStream();
while((reb=datosRecibidos.read())>-1){
z=(char) reb;
if(reb==62){
break;
}
if(reb!=-1){
tramaRecibidaInicial.append(z);
}
}
DestruirHilo=true;
} catch(IOException e1) {
estado("No response.");
}
V a a baaa, aRb.a(), a
aa a a a a a a W a a a () aa b a a , L , a a a a a ba b a, , a () a ba a b, a a a b a a a a b a aa a a aaa. E a a aa a aba a a b (=), aa () a a a aabaa a a b a a.
-
5/28/2018 Diseo de un scaner OBD
50/150
50
C a a a a aa a aaa a.a, aa a aa aba a a aaaa a a. P abaa aa a aa a a aba a ba aa RXTX, a, a
a a ba a aa a aa , ba a aaa aa.
Paa a a aaaa a aa a ba, aa a a a a aaba.La a a aa a a JAR, a a a JPG TXT, a aa a a ba aa RXTX. A a a a ab (RL. RW.ba), a a a .
La aa aa VaOBDJa a:
.A aaa.
.A ab aa L. .A ab aa W. 41 A JPG. .A a ba a. .A a b a
aaa a.
Caa a ba aa RXTX a Paa., Sa., bSa., bPaa. a aa aa aa aa a a a a.
-
5/28/2018 Diseo de un scaner OBD
51/150
51
Paa aa a aa a ba aa a a a MANIFEST a VaOBD.aa a a:
Y a a RW.ba RL. a:
-
5/28/2018 Diseo de un scaner OBD
52/150
52
3. Ra
3.1. b a
E baa a aa a aa aa aa a
aa 1996 EEUU 2001 Ea, a b
a baa, a aa aa
a aa a a a
a a O Ba DaII (OBDII), a
aa b a a.
Ea aa a , , aa a
aa a aaa a , a a a a a
ba a a b .
Aa aa aba,
ba a a a, a a
a a, a a aa,
aaa a a aa b
.
Tab a a a a
b a aa aa a a
aa a a , a
a a b .
P a a baa aa a
a aaa a a a a C++
JAVA, a a b
a .
3.2. Vaa
Ua a , a a aa
aa ba aa,
a a aba a a OBDII. Caa
a a a a
aa a, a ba a a a a.
-
5/28/2018 Diseo de un scaner OBD
53/150
53
La ba aaa aa :
C C3 1.4 HDI:Faba 2004
Ea OBDII a ISO 142304 KWP2000
Sa T 1.9 TDI:Faba 2001
Ea OBDII a ISO 91412
VWa G 1.9 TDI:Faba 2002
Ea OBDII a ISO 91412
A A3 1.9 TDI:Faba 2001
Ea OBDII a ISO 91412
Ta P (M b)Faba 2006
Ea OBDII a ISO 157654 CAN BUS
Sa L 1.9 TDI:Faba 2008
Ea OBDII a ISO 157654 CAN BUS
F F TDD:Faba 2002
Ea OBDII a SAE J1850PWM
O Aa 1.6:Faba 2001
Ea OBDII a SAE J1850VPW
O Aa 2.0 DTI:Faba 2003
Ea OBDII a ISO 91412
F E 1.8 TD:Faba 1998, a OBDII, a SAE
J1850PWM, ab aba a
aba (M 22) a
.
-
5/28/2018 Diseo de un scaner OBD
54/150
54
3.3. D a
A a b a a aa aa a
a a a a b . E a aa
OBDII, a aa a a
.
Ua aa b a ab OBDII a
a a. D a baa a a abaa, a a a a
USB. E a a aa C C3 a 2004, a
a aa a aa OBDII.
-
5/28/2018 Diseo de un scaner OBD
55/150
55
A a a aaa PC, a aa a
a a a aa a
aaa VaOBDJa. E a aa a a ab,
RL. RW.ba, a a a
a abaa.
E a aaa RW.ba aa
a:
-
5/28/2018 Diseo de un scaner OBD
56/150
56
E a aa a , aa b aaa
, a a a
(O>Sa P Ca):
Ca Sa aaab b a
b. P a a a
aa a a, a
a a a. D a a A aa
a ab.
-
5/28/2018 Diseo de un scaner OBD
57/150
57
Aa b a a (O
>Ca a). E a
a a, a a aa:
V a a a
aa a Aa a , aa
a aa. Ea ab a a ba
a a aba a aa a a a. Caa (P,ECU A, T a) b a aa,
aa a ba a a ECU, a
a aa a a a a,
a a a a
a .
-
5/28/2018 Diseo de un scaner OBD
58/150
58
E a a a a C, a
aa b a a:
Oba a a aa a
0100>41 00 98 1B 00 11 0100>86 F1 10 41 00 98 1B 00 11,
a aa a a a ECU
aaa a PID (Paa ID)
b aa a.
-
5/28/2018 Diseo de un scaner OBD
59/150
59
E a a a ECU a aa a a:
Oba a a a a0100>Uab , b a a a aa aa
ba a a ECU.
L a AT, a a a
a a a, , b a a
a a a a a
a ECU.
-
5/28/2018 Diseo de un scaner OBD
60/150
60
Aa a a aa aa
a a aaa 4 a a
a a . Paa a a a a
a a Ra , a a
a a a a ECU:
E a a a
b a a a a a
0100,0101 03. E aa a a MIL
(Ma Ia L) aa a a, a
a aaa a ECU. A aa a a a .
S a a ba a aa aaaa a a a
aa, a a Ca , aaa a
aa a aaa a a a aa, a
ba a a aa a a aa.
-
5/28/2018 Diseo de un scaner OBD
61/150
61
Oa aa aa a a a a a
aa . La aa a
b, a ECU, a a,
a a a a
. U a :
E a a ba a a a b
a , , aa , aa a,
, a aa, aa aa a
abb MAF (Ma A F), a a ba
a a aa, a a a a a a. Ea a aaa aa a
a a aa a
a a aa a a a a
a ba.
-
5/28/2018 Diseo de un scaner OBD
62/150
62
E a aa ba a aa a ECU:
S ba a a b a aa a a ba a a
MIL (Ma Ia La) a.
O a a a a
bb a a a, aa a bba
a a . Pa a a a 22070Ka
a a 220,7 ba , a a a
aa a aa 2000 ba a,
baa aab.
-
5/28/2018 Diseo de un scaner OBD
63/150
63
E a a a ba a a a aaa a
a, a aa a 751 a 1613.
Oba a aa a a aa
a, b a a a a. L a
a aa a ab a , ab a MAF
A F Ra a a abb a. E Caa
a a a ab aa, a a b a
aa a a a a
aa a a a, a a aa a a
a a, . E b a a a a a, b a
a aa a a a a aa a
.
-
5/28/2018 Diseo de un scaner OBD
64/150
64
Ua a a aa aa a a a
a :
Oba a a ,
aa a a 1500 , a a ba a
aaa a aa a a 1510 . S
ba ab a a a a, 0 / a
ba aa.
-
5/28/2018 Diseo de un scaner OBD
65/150
65
Haa aa a a a a ba a a
W XP, ab aa a a a,
L. E a a aa:
E a a a a a baa a L, a a b Ub 8.04, a aa a JAVA aaa.
R a L a a a a aaa b a
. E a a
a b S0, ACM0 USB0, a a
COM1, COM2, COM3, ., W a ba aa
aaa /. P a a aaa aa La a a ba
a a a a a RS232, a a a
//SO, a a aa
a a.
-
5/28/2018 Diseo de un scaner OBD
66/150
66
Ma a a ab a USB,
a, W a a ab COM a
ba, L a a aa //ACM0,
a , aa
a ba aa RXTX, a a a .
Paa a a a a a
a L, a a a b a a
//ACM0 a a a a ba,
//S0:
> //S0 //ACM0
D a a a S0
aa ACM0, a a aa
ba.
3.4. Aa
C a a a a a, a
aa a a baa ba. E a
a aab a a aa aa aa a aa
a 1996 EEUU 2001 Ea. E a a a a a
b a aba a aa a OBDII, a a
ab aba a a
a aa OBD, , a a
, aba aaa aba a
aa aba a aa aa a a
a , a a aa aa
a .
P a a aa a ab
a a a
a a aa
aa a aa ba a baa
a a a ECU
a a a
a aba.
-
5/28/2018 Diseo de un scaner OBD
67/150
67
O a a a a a
OBDII ba a a
a aaa C E a a.
E a a a aa
a aa a a C E b b
b b a b ba.
Oa a aa a a aa
a a a a
aa ba a a aa a ,
a.
C a aa, a aa a
b OBDII, aa a aa
b a a a a.
4. Ca a
4.1 Pa aba
E a aba a aa
:
1.C aa aaa a aa PIC.
2.Ma a a aa PCB a a .
3.Ma ab OBDII aa a a a aa ba.4.Cba a a a aaa
a AT a a
PIC18F2550.
5.Iaa a a a WXP L Ub 8.04 a a aa a JAVA.
6.Iaa a ab a a aa ba a.
-
5/28/2018 Diseo de un scaner OBD
68/150
68
7.Ca a a a aa aa aa.
8.Paa aa ba C++ Jaa.9.Paa aa a JAVA a
a ba a a a
aa a a ab.
10.Va a a aa b a aa ba.
11.Va a a aa b a aaa a ba.
12.Va a a aa a a, W L.
4.2 La aa
La aa aa a a:
J1 C USB B
J2 C DB9 Ma
Q1,Q3 Ta 2N7000
Q2 Ta BS250/VP2106
IC1 PIC18F2455
IC2 MC33290
IC3 MC33390/MC33990
IC4 MCP2551/PCA82C250
IC5 MCP2515
X1 Ca, 16.000M
X2 Ca, 20.000M
D1 LED 5
D2 LED Aa 5
-
5/28/2018 Diseo de un scaner OBD
69/150
69
D3 LED 5
D4,D5 D 1N4148
R1,R4,R5,R8 10K O
R2,R3 330 O
R6,R7 22K O
R9,R10 510 O
R11,R12 100 O
C1,C2,C4,C5 15F
C3,C8,C9 0.1F
C6 0.47F
C10,C11 560F
C7 10F 16V
IC S S aa PIC18F2550 28
La aa aa a aa:
J1 C DB9 Hba
D1, D2, D6, D7 D 1N4149
D4 D Z 6.2 V
D5 D Z 5.1 V
D3 LED R 5
Q1, Q2 Ta 2N3904
C1, C4 33F
C2 100F 16V
C3 22F 6.3V
R3 100
R1 1.5K
R2 10K
-
5/28/2018 Diseo de un scaner OBD
70/150
70
La a aa a a :
B DC++: Paa a aa a a C++.
E 3.2: Paa a a aa a a JAVA.
SaT: Paa a OBDII baa aELM327.
H W: Paa aa a a aaa.
PICP Pa: Ua aa aa a PIC18F2550.
GbMa: Paa a aa a a.
JDK 6 Ua 13: Pa aa a a a JAVA. PC ba WXP H E L Ub 8.04
aa aa aa a aa.
Oa WXP H E Y L Ub 8.04aa aa aa a ba .
4.3 P
La aba a aa :
Ra Caa P a P a
Maa a aMaa a aa
Cab OBDII a DB9 ba
Cab USB AB
Ha aba
11
1
1
35
205
5
2
30
205
5
2
1050
Ta 1082
-
5/28/2018 Diseo de un scaner OBD
71/150
71
4.4 Ob a
Da a b
a a a aa aa. A
a aa :
C a a a a. La ab OBDII a a aa a ba a
ab.
P a a a aa a (ECU), aOBDII.
Ca a a a a a aa a a C++ JAVA.
C a a aa a aa b a a b aaa a a a ECU.
Faa a a aa a JAVA a a a.
Eaba a aa a JAVA a a a a a a a a a.
C a aa a JAVA a a W L.
4.5 C
E a aa JAVA a aa , a a a aa a a a a
a a aaa.
E b a a a aa a aa a a. E aa a aa a a aa.
-
5/28/2018 Diseo de un scaner OBD
72/150
72
La a a b a (aba), a aa aa ab a a
, a a a a a.
L aba a a a a OBDIIba EE.UU. U.E a a baa ab a a
aa, a a .
E a aab aa a aaa, a a a
USB, a a a a a aaa
a a . E a aa
.
4.6. Ma a
Iaaa a a aa a a a a a a a
a .
Ia aba a OBDII a .
Da a a a a ba a aa aa a a aa,
a a ba DTC.
Ia a a aaa aa aa a a a. Ea a
a a aa baa aba.
Ca a aa aa a a aa aa a aa.
-
5/28/2018 Diseo de un scaner OBD
73/150
73
Bbaa
[1] OBD2 ELM327 ab AP aa USB, .ba.
[2] OBDII PID, WaT F Ea.[3] ASCII, WaT F Ea.
[4] OBDII Tb C H, OBDC.
[5] Sa OBD2, ...a
[6] ELM327DS., ..
[7] ELM320DS., ..
[8] 18F2455_2550., ..
[9]Lba aa RXTX, ..
-
5/28/2018 Diseo de un scaner OBD
74/150
74
AC aa a a ba RXTX a Jaa,
b ..:
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class TwoWaySerialComm
{
public TwoWaySerialComm()
{
super();
}
void connect ( String portName ) throws Exception
{
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
if ( portIdentifier.isCurrentlyOwned() )
{
System.out.println("Error: Port is currently in use");
}
else
{
CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);
if ( commPort instanceof SerialPort )
{SerialPort serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(57600,SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
InputStream in = serialPort.getInputStream();
OutputStream out = serialPort.getOutputStream();
(new Thread(new SerialReader(in))).start();
(new Thread(new SerialWriter(out))).start();
}
else
{
System.out.println("Error: Only serial ports are handled by this example.");
}
}
}
-
5/28/2018 Diseo de un scaner OBD
75/150
75
public static class SerialReader implements Runnable
{
InputStream in;
public SerialReader ( InputStream in )
{
this.in = in;
}
public void run ()
{
byte[] buffer = new byte[1024];
int len = -1;
try
{
while ( ( len = this.in.read(buffer)) > -1 )
{
System.out.print(new String(buffer,0,len));
}
}
catch ( IOException e )
{
e.printStackTrace();
}}
}
public static class SerialWriter implements Runnable
{
OutputStream out;
public SerialWriter ( OutputStream out )
{
this.out = out;
}
public void run ()
{
try
{
int c = 0;
while ( ( c = System.in.read()) > -1 )
{
this.out.write(c);
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}
public static void main ( String[] args )
{
try
{
(new TwoWaySerialComm()).connect("COM3");
}
catch ( Exception e )
{
e.printStackTrace();
}
}
}
-
5/28/2018 Diseo de un scaner OBD
76/150
76
C a aa :
Ca C:
packageDatos;
publicclassConexion {
intvelocidad;
intdataBits;
intstopBits;
intparidad;
String nombrePuerto;
String protocolo;
publicConexion(intvelocidad, intdataBits, intstopBits, int
paridad, String nombrePuerto, String protocolo) {
super();
this.velocidad= velocidad;
this.dataBits= dataBits;
this.stopBits= stopBits;
this.paridad= paridad;
this.nombrePuerto= nombrePuerto;
this.protocolo= protocolo;
}
publicintgetDataBits() {
returndataBits;
}
publicintgetStopBits() {
returnstopBits;
}
publicString getNombrePuerto() {
returnnombrePuerto;
}
publicintgetParidad() {
returnparidad;
}
publicintgetVelocidad() {
returnvelocidad;
}
publicString getProtocolo(){
returnprotocolo;
}
}
-
5/28/2018 Diseo de un scaner OBD
77/150
77
Ca CaC:
packageDatos;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.util.Date;importjava.util.Enumeration;
importjava.util.Vector;
importjavax.swing.JTextArea;
importgnu.io.CommPortIdentifier;
importgnu.io.NoSuchPortException;
importgnu.io.PortInUseException;
importgnu.io.SerialPort;
import gnu.io.UnsupportedCommOperationException;
publicclassControladorConexion implementsRunnable{
SerialPort port;
CommPortIdentifier idpuerto;OutputStream datosEnviados;
InputStream datosRecibidos;
String estado;
StringBuffer tramaEnviada;
StringBuffer tramaRecibidaInicial;
StringBuffer tramaDatos;
StringBuffer tramaDatosCan;
StringBuffer tramaMediciones;
StringBuffer pids_disponibles;
JTextArea respuestaTexto;
String strDatos;
lecturaTXTErrores lecErr;
booleanconexionCOM=false;booleanlisto=false;
booleanprocesaDatos=false;
booleanpermisoEnvioManual=false;
booleanDestruirHilo=false;
privatevolatileThread hilo;
Date temps,temps2;
String numeroProtocolo;
Vector ids;
String ID;
MuestraIDs MIDs;
Conexion con;
publicControladorConexion(JTextArea respuestaTexto) {
this.respuestaTexto=respuestaTexto;
lecErr= newlecturaTXTErrores();
MIDs= newMuestraIDs();
}
publicvoidestablecerConexion(Conexion con){
this.con=con;
this.tramaEnviada=newStringBuffer();
this.tramaRecibidaInicial=newStringBuffer();
this.tramaDatos=newStringBuffer();
this.tramaDatosCan=newStringBuffer();
this.tramaMediciones=newStringBuffer();this.pids_disponibles=newStringBuffer();
this.ID="";
this.numeroProtocolo="0";
-
5/28/2018 Diseo de un scaner OBD
78/150
78
if(conexionCOM==false){
try{
idpuerto=
CommPortIdentifier.getPortIdentifier(con.getNombrePuerto());
} catch(NoSuchPortException e) {
estado("Port "+con.getNombrePuerto()+" not available.");
}
try{
port= ( SerialPort )idpuerto.open("VisualOBD",2000);
} catch(PortInUseException e) {
estado("Port "+con.getNombrePuerto()+" in use.");
}
try{
port.setSerialPortParams(con.getVelocidad(),
con.getDataBits(),
con.getStopBits(),
con.getParidad());
} catch(UnsupportedCommOperationException e) {
estado("Operation not supported.");
}
hilo=newThread(this);
hilo.start();
hilo.setPriority(Thread.MIN_PRIORITY);
conexionCOM=true;
}
estado("Connected "+con.getNombrePuerto()+".");
enviar("atz");
enviar(con.getProtocolo());
enviar("0100");
enviar("atdp");
enviar("atdpn");
enviar("ath1");
enviar("0100");
timer();
}
publicvoiddesconectar(){
if(conexionCOM==true){
enviar("atws");//En linux el hilo del run, se para en el
datosRecibidos.read(), por tanto necessiatmos mandar algo
DestruirHilo=false;//para que se mueva de ahi, atws esta bien porque resetea
//la interface al desconectar.
while(DestruirHilo==false){//Espera a que se reciba la ultima trama en run()
//para poder despues destruir el hilo y cerrar los
//puertos.
try{Thread.sleep(10);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
hilo= null;//Obliga a desacer el bucle del hilo para asi pararlo de forma
//segura.
conexionCOM=false;//Cuando el hilo ya ha recibido la informacion (en linux),
//sigue el camino muriendo, ya que hilo=null
try{
datosEnviados.close();
} catch(IOException e) {
estado("Failed to close communication");}
try{
-
5/28/2018 Diseo de un scaner OBD
79/150
79
datosRecibidos.close();
} catch(IOException e) {
estado("Failed to close communication.");
}
try{
port.disableReceiveFraming();//Meramente formal
port.close();
estado("Offline.");
} catch(Exception e){
estado("Failed to close port");
}
}else{
estado("You are not connected.");
}
}
publicvoidenviar(String trama){
intlongitudTramaEnv=0;
intdata;
listo=false;
if(conexionCOM==true){
this.tramaEnviada.append(trama+"\r");//Solamente necessita el retorno de
//carro, sin el salto de linea.
try{
datosEnviados= port.getOutputStream();
for(inti=0;i-1){
z=(char) reb;
if(reb==62){ //Cuando se recibe 62 = >, se sale del bucle
//para separar los mensajes.
//Se hace break en run
break;
}
if(reb!=-1){
tramaRecibidaInicial.append(z);
}
}DestruirHilo=true;//Esto da permiso al metodo desconectar() para
//poner el hilo=null.
-
5/28/2018 Diseo de un scaner OBD
80/150
80
} catch(IOException e1) {
estado("No response.");
}
if(reb==62){
try{
tramaRecibidaInicial.deleteCharAt(tramaRecibidaInicial.length()-1);
//Se borra el ltimo
//salto de linea
} catch(RuntimeException e2) {estado("No response.");}
estado("Sent "+tramaRecibidaInicial.toString());
tramaRecibida=tramaRecibidaInicial.toString();
longitudTrama=tramaRecibidaInicial.length();
tramaRecibidaInicial.delete(0, longitudTrama);
if(permisoEnvioManual==false){
for(int x=0;x=6){
try{
if(tramaDatos.codePointAt(8)==52){
-
5/28/2018 Diseo de un scaner OBD
81/150
81
//El siguiente metodo diferencia las cabeceras CAN.
if(ID.compareTo("")==0){
ids=newVector();
for(intf=0;f
-
5/28/2018 Diseo de un scaner OBD
82/150
82
}catch(Exception e){
//System.out.println(e);
strDatos="N";
}
}
}
listo=true;
longitudTrama=tramaDatos.length();
tramaDatos.delete(0, longitudTrama);
}
permisoEnvioManual=false;
}
}
}
publicVector puertosdisponibles(){
intj=1;
Vector listapuertos = newVector();
for(Enumeration i = CommPortIdentifier.getPortIdentifiers() ; i.hasMoreElements() ;) {
CommPortIdentifier idpuerto = (CommPortIdentifier) i.nextElement();
listapuertos.add(j++ +". " + idpuerto.getName()+"\n");
}
returnlistapuertos;
}
publicvoidestado(String estado){
respuestaTexto.append(">"+estado+"\n\n");
respuestaTexto.setCaretPosition( respuestaTexto.getText().length() );
}
publicString devuelve_cantidad_errores(){
if(conexionCOM==true){
//esperando cantidad de errores
timer();
//strDatos="\n41 01 84 4B A5 F1 0A\r";
//asignando cantidad de errores
if(strDatos.compareTo("N")==0){
return"ECU does not respond.";
}elseif(strDatos.compareTo("Neg")==0){
return"ECU responded negatively.";
}elseif(strDatos.compareTo("NElm")==0){
return"ELM does not respond.";
}else{
returnlecErr.descifraTramaHex(strDatos);
}
}else{return"Without connection port.";
}
}
publicString devuelve_descripcion_errores(){//Este metodo coje 2 o mas lineas de errores
if(conexionCOM==true){ //Al devolver 2 lineas, entre lineas no hay el
//simbolo ">", esto puede ser bueno.
//esperando descripcion de errores
timer();
//strDatos="\n43 01 33 02 45 61 21 0A\r\n43 01 33 02 45 61 21 0A\r";
//asignando cantidad de errores
if(strDatos.compareTo("N")==0){return"Not received information about errors.";
}elseif(strDatos.compareTo("Neg")==0){
-
5/28/2018 Diseo de un scaner OBD
83/150
83
return"ECU responded negatively.";
}elseif(strDatos.compareTo("NElm")==0){
return"ELM does not respond.";
}else{
returnlecErr.descifraTramaHexDescripcionErrores( strDatos+"\n");
}
}else{
return"First you must connect to the COM port.";
}
}
publicString borrado_de_errores(){
if(conexionCOM==true){
timer();
//strDatos="\n44 0A\r";
if(strDatos.compareTo("N")==0){
return"ECU does not respond.";
}elseif(strDatos.compareTo("Neg")==0){
return"ECU responded negatively.";
}elseif(strDatos.compareTo("NElm")==0){
return"ELM does not respond.";
}else{
return"Removed errors stored in the ECU..";
}
}else{
return"Without connection port.";
}
}
publicString devuelve_pid(){
timer();
//strDatos="\n41 0C 04 88 8F B0\r";
if(strDatos.compareTo("N")==0){
strDatos="\n41 0C 00 00 00 00\r";//Para que no pete el hilo de mediciones si llega
//un NO DATA o algo inadecuado.
estado("ECU does not respond");
returnstrDatos;
}elseif(strDatos.compareTo("Neg")==0){
strDatos="\n41 0C 00 00 00 00\r";
estado("ECU responded negatively");
returnstrDatos;
}elseif(strDatos.compareTo("NElm")==0){
strDatos="\n41 0C 00 00 00 00\r";
estado("ELM does not respond");
returnstrDatos;
}else{
returnstrDatos;
}}
publicbooleanestado_conexion(){
returnconexionCOM;
}
publicvoidborrar_pids_establecidos(){
intlongitudTrama;
longitudTrama=pids_disponibles.length();
pids_disponibles.delete(0, longitudTrama);
}
publicvoidestablece_pids(){if(conexionCOM==true){
//esperando pids
-
5/28/2018 Diseo de un scaner OBD
84/150
84
timer();
//asignando pids
String pids_binario;
//strDatos="\n41 00 FF FF FF FF 0A\r";
intpids_decimal;
intlongitud_trama;
intt=7;
if(strDatos.compareTo("N")==0){
pids_disponibles.append("N00000000000000000000000000000000");
estado("ECU does not respond");
}elseif(strDatos.compareTo("Neg")==0){
pids_disponibles.append("N00000000000000000000000000000000");
estado("ECU responded negatively");
}elseif(strDatos.compareTo("NElm")==0){
pids_disponibles.append("N00000000000000000000000000000000");
estado("ELM does not respond");
}else{
for(intq=0;q
-
5/28/2018 Diseo de un scaner OBD
85/150
85
publicvoidasignaIDCanBus(){
ID=MIDs.getJListIDs().getSelectedValue().toString();
}
publicvoidtimer(){
temps=newDate();
while(agafatemps()-temps.getTime()
-
5/28/2018 Diseo de un scaner OBD
86/150
86
publicString descifraTramaHex(String error){
String estadoErrores;
intvalorDec;
valorDec=Integer.parseInt(error.substring(7, 9), 16);
if(valorDec
-
5/28/2018 Diseo de un scaner OBD
87/150
87
}
incremento=incremento+6;//Coloca la posicion en la trama para el siguiente
//error
if(error.codePointAt(incremento+3)==10){ //Si detecta salto de linea se
//prepara la posicion para el siguiente error en la siguiente linea
incremento=incremento+7;
}
String codError=valorHex.toString();
String sCadena;
try{
fr= newFileReader("CodigosErrores.txt");
bf= newBufferedReader(fr);
while((sCadena = bf.readLine())!=null) {
if(codError.compareTo(sCadena.substring(0, 5))==0){//se compara
//el error leido con cada linea del fichero, si lo encuentra se sale del bucle
codigoError.append(sCadena+"\n\n");
codigo_encontrado=true;
break;
}
}
if(codigo_encontrado==false){
codigoError.append("Unknown "+codError+" error\n\n");
}
} catch(IOException e) {
codigoError.append("Database error codes inaccessible");
}
longitudTrama=valorHex.length();//Se deja vacio el buffer que contiene el
//cdigo procedente de la ECU
valorHex.delete(0, longitudTrama);
}
returncodigoError.toString();
}
}
-
5/28/2018 Diseo de un scaner OBD
88/150
88
Ca MaID:
packageDatos;
importjavax.swing.JPanel;
importjavax.swing.JFrame;
importjavax.swing.JList;
importjava.awt.Rectangle;importjavax.swing.JButton;
importjavax.swing.JScrollPane;
publicclassMuestraIDs extendsJFrame {
privatestaticfinallongserialVersionUID= 1L;
privateJPanel jContentPane= null;
privateJList jListIDs= null;
privateJButton jButtonIDsAceptar= null;
privateJScrollPane jScrollPaneListaIDs= null;
publicMuestraIDs() {
super();
initialize();
}
privatevoidinitialize() {
this.setSize(300, 200);
this.setLocation(500, 200);
this.setContentPane(getJContentPane());this.setTitle("CAN Bus IDs");
}
privateJPanel getJContentPane() {
if(jContentPane== null) {
jContentPane= newJPanel();
jContentPane.setLayout(null);
jContentPane.add(getJButtonIDsAceptar(), null);
jContentPane.add(getJScrollPaneListaIDs(), null);
}
returnjContentPane;
}
publicJList getJListIDs() {
if(jListIDs== null) {
jListIDs= newJList();
}
returnjListIDs;
}
publicJButton getJButtonIDsAceptar() {
if(jButtonIDsAceptar== null) {
jButtonIDsAceptar= newJButton();
jButtonIDsAceptar.setBounds(newRectangle(200, 133, 82, 22));
jButtonIDsAceptar.setText("OK");}
returnjButtonIDsAceptar;
}
-
5/28/2018 Diseo de un scaner OBD
89/150
89
privateJScrollPane getJScrollPaneListaIDs() {
if(jScrollPaneListaIDs== null) {
jScrollPaneListaIDs= newJScrollPane();
jScrollPaneListaIDs.setBounds(newRectangle(10, 10, 273, 115));
jScrollPaneListaIDs.setViewportView(getJListIDs());
}
returnjScrollPaneListaIDs;
}
}
Ca CaDC:
packageDominio;
importjava.util.Vector;
importjavax.swing.JTextArea;
importDatos.Conexion;
importDatos.ControladorConexion;
publicclassControladorDominioConexion{
Conexion con;
ControladorConexion contCon;
publicControladorDominioConexion(JTextArea respuestaTexto) {
contCon= new ControladorConexion(respuestaTexto);
}
publicvoidestablecerConexion(intvelocidad,intdataBits,intstopBits,int
paridad,String nombrePuerto,String protocolo){
con= new Conexion(velocidad,dataBits,stopBits,paridad,nombrePuerto,protocolo);
contCon.establecerConexion(con);
}
publicvoidenviar(String tramaEnviada){
contCon.enviar(tramaEnviada);
}
publicvoiddesconectar(){
contCon.desconectar();
}
publicVector puertosdisponibles(){returncontCon.puertosdisponibles();
}
publicString devuelve_cantidad_errores(){
returncontCon.devuelve_cantidad_errores();
}
publicString devuelve_descripcion_errores(){
returncontCon.devuelve_descripcion_errores();
}
publicbooleanestado_conexion(){
returncontCon.estado_conexion();}
-
5/28/2018 Diseo de un scaner OBD
90/150
90
publicString cojer_pids(){
returncontCon.cojer_pids();
}
publicString devuelvePid(){
returncontCon.devuelve_pid();
}
publicvoidestablece_pids(){
contCon.establece_pids();
}
publicString borrado_de_errores(){
returncontCon.borrado_de_errores();
}
publicvoidborrar_pids_establecidos(){
contCon.borrar_pids_establecidos();
}
publicvoidpermiteEnvioManual(booleanpermiso){
contCon.permiteEnvioManual(permiso);
}
}
Ca CaBaE:
packagePresentacion;
importjavax.swing.JPanel;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjava.awt.Rectangle;
importjavax.swing.JButton;
publicclassConfirmacionBorradoErrores extendsJFrame {
privatestaticfinallongserialVersionUID= 1L;
privateJPanel jContentPane= null;
privateJLabel jLabelConfirmaErrores= null;
privateJButton jButtonOK= null;
privateJLabel jLabelConfirmarBorradoErrores= null;
privateJButton jButtonCancel= null;
publicConfirmacionBorradoErrores() {
super();
initialize();
}
privatevoidinitialize() {
this.setSize(330, 200);
this.setLocation(500,200);
this.setContentPane(getJContentPane());
-
5/28/2018 Diseo de un scaner OBD
91/150
91
this.setTitle("Confirm erasing error codes");
}
privateJPanel getJContentPane() {
if(jContentPane== null) {
jLabelConfirmarBorradoErrores= newJLabel();
jLabelConfirmarBorradoErrores.setBounds(newRectangle(10, 41, 206, 20));
jLabelConfirmarBorradoErrores.setText("Do you really want to continue?");
jLabelConfirmaErrores= newJLabel();
jLabelConfirmaErrores.setBounds(newRectangle(10, 20, 308, 20));
jLabelConfirmaErrores.setText("You will erase all error codes stored in
the ECU.");
jContentPane= newJPanel();
jContentPane.setLayout(null);
jContentPane.add(jLabelConfirmaErrores, null);
jContentPane.add(getJButtonOK(), null);
jContentPane.add(jLabelConfirmarBorradoErrores, null);
jContentPane.add(getJButtonCancel(), null);
}
returnjContentPane;
}
publicJButton getJButtonOK() {
if(jButtonOK== null) {
jButtonOK= newJButton();
jButtonOK.setBounds(newRectangle(161, 135, 75, 20));
jButtonOK.setText("OK");
}
returnjButtonOK;
}
publicJButton getJButtonCancel() {
if(jButtonCancel== null) {
jButtonCancel= newJButton();
jButtonCancel.setBounds(newRectangle(235, 135, 75, 20));
jButtonCancel.setText("Cancel");
}
returnjButtonCancel;
}
}
-
5/28/2018 Diseo de un scaner OBD
92/150
92
Ca CaE:
packagePresentacion;
importjavax.swing.JPanel;
import Dominio.ControladorDominioConexion;
publicclassControladorErrores {
VistaCodigosError VCE;
ControladorDominioConexion contDom;
ControladorMediciones contMed;
ConfirmacionBorradoErrores confErr;
booleanventanaConfirmaErrores;
publicControladorErrores(ControladorDominioConexion contDom,ControladorMediciones contMed){
this.contMed=contMed;
VCE= newVistaCodigosError();
this.contDom= contDom;
ventanaConfirmaErrores=false;
eventos();}
publicvoideventos(){
VCE.getJButtonErrores().addMouseListener( newjava.awt.event.MouseAdapter() {
publicvoidmouseClicked(java.awt.event.MouseEvent e) {
if(contMed.lectura==true){
contMed.pararHilo=true;
contMed.inicializacion=true;
contMed.lectura=false;
while(contMed.indica_hilo_destruido==false){
try{
Thread.sleep(10);} catch(InterruptedException error) {
error.printStackTrace();
}
}
}
consulta_errores();
}
});
VCE.getJButtonBorrarErrores().addMouseListener( newjava.awt.event.MouseAdapter() {
publicvoidmouseClicked(java.awt.event.MouseEvent e) {
if(ventanaConfirmaErrores==false){
confirmaErrores();ventanaConfirmaErrores=true;//Esta variable evita que podamos
//abrir varias ventanas.
}
}
});
}
publicvoidconsulta_errores(){
contDom.enviar("0101");
VCE.getJTextAreaErrores().append(contDom.devuelve_cantidad_errores()+"\n\n");
contDom.enviar("03");
VCE.getJTextAreaErrores().append(contDom.devuelve_descripcion_errores()+ "\n\n");
}publicJPanel devuelve_panel(){
returnthis.VCE;
}
-
5/28/2018 Diseo de un scaner OBD
93/150
93
publicvoidconfirmaErrores(){
confErr=new ConfirmacionBorradoErrores();
confErr.setVisible(true);
confErr.getJButtonOK().addActionListener( newjava.awt.event.ActionListener() {
publicvoidactionPerformed(java.awt.event.ActionEvent e) {
contDom.enviar("04");
VCE.getJTextAreaErrores().append( contDom.borrado_de_errores()+"\n\n");
confErr.setVisible(false);
ventanaConfirmaErrores=false;
}
});
confErr.getJButtonCancel().addActionListener( newjava.awt.event.ActionListener() {
publicvoidactionPerformed(java.awt.event.ActionEvent e) {
confErr.setVisible(false);
ventanaConfirmaErrores=false;
}
});
confErr.addWindowListener(newjava.awt.event.WindowAdapter() {
publicvoidwindowClosing(java.awt.event.WindowEvent e) {
confErr.setVisible(false);
ventanaConfirmaErrores=false;
}
});
}
}
Ca CaM:
packagePresentacion;
importjava.text.DecimalFormat;
importjavax.swing.JPanel;
import Dominio.ControladorDominioConexion;
publicclassControladorMediciones implementsRunnable{
VistaMediciones VMed;
ControladorDominioConexion contDom;String pids_disponibles;
DecimalFormat df;
booleanlectura=false;
booleanpararHilo=false;
booleaninicializacion=false;
booleanindica_hilo_destruido;
booleanconectado=false;
Thread hilo;
publicControladorMediciones(ControladorDominioConexion contDom){
VMed= newVistaMediciones();
this.contDom= contDom;
df= newDecimalFormat("0.0");//Especifica los decimales mostrados en las TextField.eventos();
}
-
5/28/2018 Diseo de un scaner OBD
94/150
94
publicvoideventos(){
VMed.getJButtonLeer().addMouseListener( newjava.awt.event.MouseAdapter() {
publicvoidmouseClicked(java.awt.event.MouseEvent e) {
if(lectura==false){
if(conectado==true){
if(inicializacion==true){
hilo= newThread(ControladorMediciones.this);
inicializacion=false;
indica_hilo_destruido=false;
}
contDom.borrar_pids_establecidos();
contDom.enviar("0100");
contDom.establece_pids();
contDom.enviar("0120");
contDom.establece_pids();
contDom.enviar("0140");
contDom.establece_pids();
pids_disponibles=contDom.cojer_pids();
if(pids_disponibles.codePointAt(0)==78){
lectura=false;
}else{
pararHilo=false;
lectura=true;
hilo.start();
}
}else{
contDom.enviar("0100");
}
}
}
});
VMed.getJButtonDetener().addMouseListener( newjava.awt.event.MouseAdapter() {
publicvoidmouseClicked(java.awt.event.MouseEvent e) {if(conectado==true){
pararHilo=true;
lectura=false;
inicializacion=true;
}else{
contDom.enviar("0100");
}
}
});
}
publicJPanel devuelve_panel(){
returnthis.VMed;}
publicvoidrun(){
while(true){
if(pids_disponibles.codePointAt(3)==49){
contDom.enviar("0104");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField04().setText(df.format((valorDec*100)/255)+"%");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}if(pids_disponibles.codePointAt(4)==49){
contDom.enviar("0105");
-
5/28/2018 Diseo de un scaner OBD
95/150
95
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField05().setText(Integer. toString(valorDec-40)+"C");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(5)==49){
contDom.enviar("0106");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField06().setText(df.format(((valorDec-
128)*100)/128)+"%");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(6)==49){
contDom.enviar("0107");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField07().setText(df.format(((valorDec-
128)*100)/128)+"%");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(7)==49){
contDom.enviar("0108");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField08().setText(df.format(((valorDec-
128)*100)/128)+"%");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(8)==49){
contDom.enviar("0109");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField09().setText(df.format(((valorDec-
128)*100)/128)+"%");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(9)==49){contDom.enviar("010A");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField0A().setText(Integer. toString(valorDec*3)+"kPa");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(10)==49){
contDom.enviar("010B");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField0B().setText(Integer. toString(valorDec)+"kPa");
if(pararHilo==true){indica_hilo_destruido=true;
break;
-
5/28/2018 Diseo de un scaner OBD
96/150
96
}
}
if(pids_disponibles.codePointAt(11)==49){
contDom.enviar("010C");
inta=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
intb=Integer.parseInt(contDom.devuelvePid().substring(10,12), 16);
VMed.getJTextField0C().setText(Integer.toString(((a*256)+b)/4)+"rpm");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(12)==49){
contDom.enviar("010D");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField0D().setText(Integer. toString(valorDec)+"km/h");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(13)==49){
contDom.enviar("010E");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField0E().setText(df.format((valorDec/2)-64)+"");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(14)==49){
contDom.enviar("010F");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField0F().setText(Integer. toString(valorDec-40)+"C");
if(pararHilo==true){indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(15)==49){
contDom.enviar("0110");
inta=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
intb=Integer.parseInt(contDom.devuelvePid().substring(10,12), 16);
VMed.getJTextField10().setText(df.format(((a*256)+b)/100)+"g/s");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}}
if(pids_disponibles.codePointAt(16)==49){
contDom.enviar("0111");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField11().setText(df.format((valorDec*100)/255)+"%");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(17)==49){
contDom.enviar("0112");
StringBuffer trama_binaria=newStringBuffer();intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
String pids_binario=Integer.toString(valorDec, 2);
-
5/28/2018 Diseo de un scaner OBD
97/150
97
for(int f=0;f
-
5/28/2018 Diseo de un scaner OBD
98/150
98
}
}
if(pids_disponibles.codePointAt(23)==49){
contDom.enviar("0118");
intvoltios=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
intporcentaje=Integer.parseInt(contDom.devuelvePid().substring(10,12), 16);
VMed.getJTextField18().setText(df.format(voltios*(0.005))+"V
"+df.format((porcentaje-128)*(100/128))+ "%");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(24)==49){
contDom.enviar("0119");
intvoltios=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
intporcentaje=Integer.parseInt(contDom.devuelvePid().substring(10,12), 16);
VMed.getJTextField19().setText(df.format(voltios*(0.005))+"V
"+df.format((porcentaje-128)*(100/128))+ "%");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(25)==49){
contDom.enviar("011A");
intvoltios=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
intporcentaje=Integer.parseInt(contDom.devuelvePid().substring(10,12), 16);
VMed.getJTextField1A().setText(df.format(voltios*(0.005))+"V
"+df.format((porcentaje-128)*(100/128))+ "%");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}if(pids_disponibles.codePointAt(26)==49){
contDom.enviar("011B");
intvoltios=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
intporcentaje=Integer.parseInt(contDom.devuelvePid().substring(10,12), 16);
VMed.getJTextField1B().setText(df.format(voltios*(0.005))+"V
"+df.format((porcentaje-128)*(100/128))+ "%");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(27)==49){contDom.enviar("011C");
String valorHex=contDom.devuelvePid().substring(7,9);
if(valorHex.compareTo("01")==0){
VMed.getJTextField1C().setText("OBD-II as defined by the CARB");
}elseif(valorHex.compareTo("02")==0){
VMed.getJTextField1C().setText("OBD as defined by the EPA");
}elseif(valorHex.compareTo("03")==0){
VMed.getJTextField1C().setText("OBD ''and'' OBD-II");
}elseif(valorHex.compareTo("04")==0){
VMed.getJTextField1C().setText("OBD-I");
}elseif(valorHex.compareTo("05")==0){
VMed.getJTextField1C().setText("Not meant to comply with any OBD
standard");}elseif(valorHex.compareTo("06")==0){
VMed.getJTextField1C().setText("EOBD");
-
5/28/2018 Diseo de un scaner OBD
99/150
99
}else{
VMed.getJTextField1C().setText("Unknown");
}
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(29)==49){
contDom.enviar("011E");
StringBuffer trama_binaria=newStringBuffer();
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
String pids_binario=Integer.toString(valorDec, 2);
for(int f=0;f
-
5/28/2018 Diseo de un scaner OBD
100/150
100
intb=Integer.parseInt(contDom.devuelvePid().substring(10,12), 16);
VMed.getJTextField23().setText(Integer.toString(((a*256)+b)*10)+"kPa");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(35)==49){
contDom.enviar("0124");
intc=Integer.parseInt(contDom.devuelvePid().substring(13,15), 16);
intd=Integer.parseInt(contDom.devuelvePid().substring(16,18), 16);
VMed.getJTextField24().setText(df.format(((c*256)+d)*(0.000122))+ "V");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(36)==49){
contDom.enviar("0125");
intc=Integer.parseInt(contDom.devuelvePid().substring(13,15), 16);
intd=Integer.parseInt(contDom.devuelvePid().substring(16,18), 16);
VMed.getJTextField25().setText(df.format(((c*256)+d)*(0.000122))+ "V");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(37)==49){
contDom.enviar("0126");
intc=Integer.parseInt(contDom.devuelvePid().substring(13,15), 16);
intd=Integer.parseInt(contDom.devuelvePid().substring(16,18), 16);
VMed.getJTextField26().setText(df.format(((c*256)+d)*(0.000122))+ "V");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(38)==49){
contDom.enviar("0127");
intc=Integer.parseInt(contDom.devuelvePid().substring(13,15), 16);
intd=Integer.parseInt(contDom.devuelvePid().substring(16,18), 16);
VMed.getJTextField27().setText(df.format(((c*256)+d)*(0.000122))+ "V");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(29)==49){contDom.enviar("0128");
intc=Integer.parseInt(contDom.devuelvePid().substring(13,15), 16);
intd=Integer.parseInt(contDom.devuelvePid().substring(16,18), 16);
VMed.getJTextField28().setText(df.format(((c*256)+d)*(0.000122))+ "V");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(40)==49){
contDom.enviar("0129");
intc=Integer.parseInt(contDom.devuelvePid().substring(13,15), 16);
intd=Integer.parseInt(contDom.devuelvePid().substring(16,18), 16);VMed.getJTextField29().setText(df.format(((c*256)+d)*(0.000122))+ "V");
if(pararHilo==true){
-
5/28/2018 Diseo de un scaner OBD
101/150
101
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(41)==49){
contDom.enviar("012A");
intc=Integer.parseInt(contDom.devuelvePid().substring(13,15), 16);
intd=Integer.parseInt(contDom.devuelvePid().substring(16,18), 16);
VMed.getJTextField2A().setText(df.format(((c*256)+d)*(0.000122))+ "V");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(42)==49){
contDom.enviar("012B");
intc=Integer.parseInt(contDom.devuelvePid().substring(13,15), 16);
intd=Integer.parseInt(contDom.devuelvePid().substring(16,18), 16);
VMed.getJTextField2B().setText(df.format(((c*256)+d)*(0.000122))+ "V");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(43)==49){
contDom.enviar("012C");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField2C().setText(df.format((valorDec*100)/255)+"%");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(44)==49){
contDom.enviar("012D");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField2D().setText(df.format((valorDec*(0.78125))-100)+ "%");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(45)==49){
contDom.enviar("012E");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField2E().setText(df.format((valorDec*100)/255)+"%");if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(46)==49){
contDom.enviar("012F");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField2F().setText(df.format((valorDec*100)/255)+"%");
if(pararHilo==true){
indica_hilo_destruido=true;
break;}
}
-
5/28/2018 Diseo de un scaner OBD
102/150
102
if(pids_disponibles.codePointAt(48)==49){
contDom.enviar("0131");
inta=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
intb=Integer.parseInt(contDom.devuelvePid().substring(10,12), 16);
VMed.getJTextField31().setText(Integer.toString((a*256)+b)+"km");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(49)==49){
contDom.enviar("0132");
inta=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
intb=Integer.parseInt(contDom.devuelvePid().substring(10,12), 16);
VMed.getJTextField32().setText(df.format((((a*256)+b)/4)-(8.192))+"Pa");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(50)==49){
contDom.enviar("0133");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField33().setText(Integer. toString(valorDec)+"kPa");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(51)==49){
contDom.enviar("0134");
intc=Integer.parseInt(contDom.devuelvePid().substring(13,15), 16);
intd=Integer.parseInt(contDom.devuelvePid().substring(16,18), 16);
VMed.getJTextField34().setText(df.format(((c*256)+d)*(0.00390625)-128)+ "mA");if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(52)==49){
contDom.enviar("0135");
intc=Integer.parseInt(contDom.devuelvePid().substring(13,15), 16);
intd=Integer.parseInt(contDom.devuelvePid().substring(16,18), 16);
VMed.getJTextField35().setText(df.format(((c*256)+d)*(0.00390625)-128)+ "mA");
if(pararHilo==true){
indica_hilo_destruido=true;
break;}
}
if(pids_disponibles.codePointAt(53)==49){
contDom.enviar("0136");
intc=Integer.parseInt(contDom.devuelvePid().substring(13,15), 16);
intd=Integer.parseInt(contDom.devuelvePid().substring(16,18), 16);
VMed.getJTextField36().setText(df.format(((c*256)+d)*(0.00390625)-128)+ "mA");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(54)==49){contDom.enviar("0137");
intc=Integer.parseInt(contDom.devuelvePid().substring(13,15), 16);
-
5/28/2018 Diseo de un scaner OBD
103/150
103
intd=Integer.parseInt(contDom.devuelvePid().substring(16,18), 16);
VMed.getJTextField37().setText(df.format(((c*256)+d)*(0.00390625)-128)+ "mA");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(55)==49){
contDom.enviar("0138");
intc=Integer.parseInt(contDom.devuelvePid().substring(13,15), 16);
intd=Integer.parseInt(contDom.devuelvePid().substring(16,18), 16);
VMed.getJTextField38().setText(df.format(((c*256)+d)*(0.00390625)-128)+ "mA");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(56)==49){
contDom.enviar("0139");
intc=Integer.parseInt(contDom.devuelvePid().substring(13,15), 16);
intd=Integer.parseInt(contDom.devuelvePid().substring(16,18), 16);
VMed.getJTextField39().setText(df.format(((c*256)+d)*(0.00390625)-128)+ "mA");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(57)==49){
contDom.enviar("013A");
intc=Integer.parseInt(contDom.devuelvePid().substring(13,15), 16);
intd=Integer.parseInt(contDom.devuelvePid().substring(16,18), 16);
VMed.getJTextField3A().setText(df.format(((c*256)+d)*(0.00390625)-128)+ "mA");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(58)==49){
contDom.enviar("013B");
intc=Integer.parseInt(contDom.devuelvePid().substring(13,15), 16);
intd=Integer.parseInt(contDom.devuelvePid().substring(16,18), 16);
VMed.getJTextField3B().setText(df.format(((c*256)+d)*(0.00390625)-128)+ "mA");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(59)==49){contDom.enviar("013C");
inta=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
intb=Integer.parseInt(contDom.devuelvePid().substring(10,12), 16);
VMed.getJTextField3C().setText(df.format((((a*256)+b)/10)-40)+"C");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(60)==49){
contDom.enviar("013D");
inta=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
intb=Integer.parseInt(contDom.devuelvePid().substring(10,12), 16);VMed.getJTextField3D().setText(df.format((((a*256)+b)/10)-40)+"C");
if(pararHilo==true){
-
5/28/2018 Diseo de un scaner OBD
104/150
104
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(61)==49){
contDom.enviar("013E");
inta=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
intb=Integer.parseInt(contDom.devuelvePid().substring(10,12), 16);
VMed.getJTextField3E().setText(df.format((((a*256)+b)/10)-40)+"C");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(62)==49){
contDom.enviar("013F");
inta=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
intb=Integer.parseInt(contDom.devuelvePid().substring(10,12), 16);
VMed.getJTextField3F().setText(df.format((((a*256)+b)/10)-40)+"C");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(63)==49){
if(pids_disponibles.codePointAt(65)==49){
contDom.enviar("0142");
inta=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
intb=Integer.parseInt(contDom.devuelvePid().substring(10,12), 16);
VMed.getJTextField42().setText(df.format(((a*256)+b)/1000)+"V");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(66)==49){
contDom.enviar("0143");
inta=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
intb=Integer.parseInt(contDom.devuelvePid().substring(10,12), 16);
VMed.getJTextField43().setText(df.format(((a*256)+b)*(100/255))+"%");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(67)==49){contDom.enviar("0144");
inta=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
intb=Integer.parseInt(contDom.devuelvePid().substring(10,12), 16);
VMed.getJTextField44().setText(df.format(((a*256)+b)*(0.0000305)));
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(68)==49){
contDom.enviar("0145");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField45().setText(df.format((valorDec*100)/255)+"%");
-
5/28/2018 Diseo de un scaner OBD
105/150
105
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(69)==49){
contDom.enviar("0146");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField46().setText(Integer. toString(valorDec-40)+"C");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(70)==49){
contDom.enviar("0147");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9),
16);
VMed.getJTextField47().setText(df.format((valorDec*100)/255)+"%");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(71)==49){
contDom.enviar("0148");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextField48().setText(df.format((valorDec*100)/255)+"%");
if(pararHilo==true){
indica_hilo_destruido=true;
break;
}
}
if(pids_disponibles.codePointAt(72)==49){
contDom.enviar("0149");
intvalorDec=Integer.parseInt(contDom.devuelvePid().substring(7,9), 16);
VMed.getJTextFiel