diseño de un scaner obd

Upload: roberto-salazar

Post on 18-Oct-2015

45 views

Category:

Documents


0 download

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