~256*10 Bytes seriell einlesen und darstellen

Seiten: (1)
Zurück zur Übersicht

Nicki

22.07.13 21:35

Hi,
da Toyota sich für wasweißichwietoll und die eigenen OBD-PIDs geheim hält muss ich wohl mit der Brechstange ran.
Immerhin weiß ich, wo die Daten sich verstecken und wie ich sie mittels ELM327-Clone abrufen kann.

Für weitergehende Erkenntnisse bräuchte ich aber eine Möglichkeit, die afaik 256 möglichen Felder des Bereichs (auch "Mode" genannt) auszulesen, was für PID (=Parameter, hat hier nichts mit Regelung zu tun) 20 z.B. so aussieht:
21 20

(Als ASCII gesendet)
Darauf antwortet der ELM327 dann ebenfalls als ASCII mit:
61 20 XX [...] XX 

Wobei XX für die einzelnen Bytes steht, die sich in diesem Fall hinter PID 20 verbergen.
Wie viele das sind weiß ich nicht genau, es ist mindestens eins, maximal sind es vielleicht 10...12.
Sie lassen sich aber eindeutig trennen dank CR und/oder LF.
...und dann darzustellen.

Das würde ich grundsätzlich so anstellen, dass ich in einer For-Schleife die PIDs abklappere, die Bytes umrechne, in ein zweidimensionales Array packe und dann -jetzt kommts- aufliste.

Wie würdet ihr das am programmierarbeitssparendsten realisieren?

Das läuft zwar recht langsam ab, der ELM braucht ja immer ein Weilchen, aber so lässt sich schon im Stand bei eingeschalteter Zündung ermitteln, welche PIDs evtl. unbelegt sind (dauerhaft 0), welche mit einem laufenden Motor und einem rollenden Fahrzeug zu tun haben (statisch oder minimal variierend) und welche z.B. zeigen, ob die Kraftstoffpumpe (lässt sich iirc (!) bei stehendem Motor mittels Gaspedal kurzzeitig aktivieren (oder war das doch der Drosselklappensteller?)) oder der Motor selbst läuft.
Die bekannten PIDs kann ich ja nach und nach von der Abfrage ausnehmen (angesichts von 2,9GHz ist so ein IF jetzt nicht wirklich tragisch...), um dann nach und nach erraten zu können, was wozu gehören könnte.

Der Nutzen ist jetzt nicht direkt ersichtlich, aber so lassen sich (möglicherweise sinnfreie) Basteleien etwas schlauer gestalten, ganz ohne irgendwelche Leitungen ziehen zu müssen
Die richtig spannenden Werte (Tankfüllung?) stehen nämlich im Standard-Mode 1 nicht zwangsläufig drin


Zuletzt bearbeitet: 22.07.13 21:50 von Nicki

Sascha

22.07.13 23:24

Ja komm, so schwer kann das doch nicht sein. Das würde man sogar mit einem Arduino hinbekommen.

Nicki

23.07.13 00:13

Mir geht es insbesondere darum, in kurzer Zeit ein funktionierendes (muss nicht schön sein) GUI zu stricken...

Fritzler

23.07.13 09:21

Dann les dich in Delphi ein.
Schneller kannste keine GUI zusammenklicken.

ferdimh

23.07.13 09:55

Für Leute, die C++ lieber mögen (wie mich) gibts das auch als "Borland C++ Builder". Ist quasi das gleiche nur ohne die meiner Meinung nach komplett schrottreife Pascal-Syntax.

shpank

23.07.13 13:58

Warum unbedingt ne GUI?

Tab-formatierte Ausgabe auf Konsole und gut ist. Vielleicht noch in hex umrechnen und fertig ist die Laube.

In Python mit Pyserial ist das ne Sache auf 10 Minuten. Und das garantiert kopfschmerzfrei.

xoexlepox

23.07.13 16:53

shpank:
Tab-formatierte Ausgabe auf Konsole und gut ist.

Als Mittelding gibt es da noch "curses" (bzw."ncurses"), aber "angenehm" zu programmieren ist das auch nicht gerade.

Name_vergessen

23.07.13 20:22

Wenn's nur e4infach darstellbar sein soll, würde ich den Kram NICHT in einem 2D-Array speichern, sondern als String mit je "\n" zwischen den Zeilen. Das kann man dann einfach in ein Textfeld-Widget stopfen und braucht nicht witer zu denken.
Das funktioniert dann auch mit printf(); ncurses will lieber explizite Positionen haben, da wäre das Array dann besser.

rastagandalf

23.07.13 20:27

shpank:
Warum unbedingt ne GUI?

Tab-formatierte Ausgabe auf Konsole und gut ist. Vielleicht noch in hex umrechnen und fertig ist die Laube.

In Python mit Pyserial ist das ne Sache auf 10 Minuten. Und das garantiert kopfschmerzfrei.

Damit hab ich auch gute Erfahrungen gemacht.

Pyserial ist da echt problemlos, und ich hab damals (wie heute ) keine Ecke Python gekonnt...

Nicki

28.07.13 12:58

Ich habe mir mal Labview "beschafft", zusammen mit einem virtuellen COM-Loopback dessen Name mir entfallen ist komme ich einigermaßen zurecht

So sieht ein Interview mit (m)einem Auto aus (händisch abgefragt):
>21 FF<\r>NO DATA<\r><\r>>21 FE<\r>NO DATA<\r><\r>>21 Fd<\r>NO DATA<\r><\r>>21 Fc<\r>NO DATA<\r><\r>>21 Fb<\r>NO DATA<\r><\r>>21 Fa<\r>NO DATA<\r><\r>>21 F9<\r>NO DATA<\r><\r>>21 F8<\r>NO DATA<\r><\r>>21 F7<\r>NO DATA<\r><\r>>21 F6<\r>NO DATA<\r><\r>>21 F5<\r>008 <\r>0: 61 F5 CB 00 00 00 <\r>1: 00 00 00 00 00 00 00 <\r><\r>>21 F5<\r>008 <\r>0: 61 F5 CB 00 00 00 <\r>1: 00 00 00 00 00 00 00 <\r><\r>>21 F5<\r>008 <\r>0: 61 F5 CB 00 00 00 <\r>1: 00 00 00 00 00 00 00 <\r><\r>>21 F5<\r>008 <\r>0: 61 F5 CB 00 00 00 <\r>1: 00 00 00 00 00 00 00 <\r><\r>>21 F5<\r>008 <\r>0: 61 F5 CB 00 00 00 <\r>1: 00 00 00 00 00 00 00 <\r><\r>>21 F5<\r>008 <\r>0: 61 F5 CB 00 00 00 <\r>1: 00 00 00 00 00 00 00 <\r><\r>>21 F4<\r>NO DATA<\r><\r>>21 F3<\r>61 F3 00 00 00 <\r><\r>>21 F2<\r>NO DATA<\r><\r>>21 F1<\r>61 F1 00 61 00 00 <\r><\r>>21 F0<\r>NO DATA<\r><\r>>21 Ef<\r>NO DATA<\r><\r>>21 Ee<\r>61 EE 00 00 00 00 <\r><\r>>21 Ed<\r>NO DATA<\r><\r>>21 Ec<\r>NO DATA<\r><\r>>21 Eb<\r>008 <\r>0: 61 EB 17 80 00 00 <\r>1: 0C C0 00 00 00 00 00 <\r><\r>>21 Ea<\r>61 EA 04 <\r><\r>>21 Ea<\r>61 EA 04 <\r><\r>>21 Ea<\r>61 EA 04 <\r><\r>>21 E9<\r>61 E9 02 <\r><\r>>21 E8<\r>NO DATA<\r><\r>>21 E7<\r>009 <\r>0: 61 E7 00 00 00 00 <\r>1: 00 0C C0 00 00 00 00 <\r><\r>>21 E6<\r>61 E6 40 90 00 40 <\r><\r>>21 E5<\r>NO DATA<\r><\r>>21 E4<\r>61 E4 04 <\r><\r>>21 E3<\r>NO DATA<\r><\r>>21 E2<\r>61 E2 F6 F7 D9 E1 80 <\r><\r>>21 E1<\r>61 E1 00 00 <\r><\r>>21 E0<\r>61 E0 D6 E4 A8 00 <\r><\r>>21 d9<\r>NO DATA<\r><\r>>21 df<\r>NO DATA<\r><\r>>21 de<\r>NO DATA<\r><\r>>21 dd<\r>NO DATA<\r><\r>>21 dc<\r>NO DATA<\r><\r>>21 db<\r>NO DATA<\r><\r>>21 da<\r>NO DATA<\r><\r>>21 d8<\r>NO DATA<\r><\r>>21 d7<\r>010 <\r>0: 61 D7 2B D4 1F 2B <\r>1: 00 29 52 2B D4 00 64 <\r>2: 09 1C 9A 00 00 00 00 <\r><\r>>21 d6<\r>NO DATA<\r><\r>>21 d5<\r>NO DATA<\r><\r>>21 d4<\r>NO DATA<\r><\r>>21 d3<\r>NO DATA<\r><\r>>21 d2<\r>NO DATA<\r><\r>>21 d1<\r>NO DATA<\r><\r>>21 d0<\r>NO DATA<\r><\r>>21 cf<\r>NO DATA<\r><\r>>21 ce<\r>NO DATA<\r><\r>>21 cf<\r>NO DATA<\r><\r>>21 cd<\r>NO DATA<\r><\r>>21 cc<\r>NO DATA<\r><\r>>21 cb<\r>NO DATA<\r><\r>>21 ca<\r>NO DATA<\r><\r>>21 c9<\r>NO DATA<\r><\r>>21 c8<\r>NO DATA<\r><\r>>21 c7<\r>NO DATA<\r><\r>>21 c6<\r>NO DATA<\r><\r>>21 c5<\r>NO DATA<\r><\r>>21 c4<\r>NO DATA<\r><\r>>21 c3<\r>NO DATA<\r><\r>>21 c2<\r>00D <\r>0: 61 C2 30 44 42 36 <\r>1: 30 00 00 03 04 D0 1F <\r><\r>>21 c1<\r>014 <\r>0: 61 C1 4B 53 50 20 <\r>1: 20 20 20 31 4B 52 46 <\r>2: 45 20 03 01 57 6C 01 <\r><\r>


EDIT:
Ha!
PID 42(hex)/66(dez) liefert einen 2 Byte großen Wert, der bei gestartetem Motor 36 a8 hex = 13992 dez beträgt und bei stehendem Motor aber eingeschaltetem Abblendlicht 30 22 hex = 12322 dez
Das kann eigentlich nur die Batteriespannung in V sein


Zuletzt bearbeitet: 29.07.13 20:18 von Nicki

Nicki

04.08.13 17:47

Ich halte es für angebracht, diesen Thread mal wieder hochzuschieben:
Diese Seite beschreibt, wie man mit dem ELM327 Daten vom CAN-Bus mitloggen kann
issue the following commands (one at a time): ATL1, ATH1, ATS1, ATAL
be sure your serial terminal app is set to log to a text file.
issue ATMA to have the scan tool start reporting all of the bus msgs it sees.
just press enter after a minute to stop the stream of data.

Steht zwar auch im Datenblatt, aber darauf muss man erst mal kommen... *freu*

100€ für nen CAN-Sniffer gespart!


Zuletzt bearbeitet: 04.08.13 17:48 von Nicki

Nicki

09.08.13 19:32

Wieder neues...
Bei meiner Karre tut sich nichts obwohl sich was tun müsste
Momentan ist kein Auto in Reichweite an das ich randürfte.
Kann jemand mit nem 327-Clone das da oben mal verifizieren?


Zuletzt bearbeitet: 09.08.13 19:33 von Nicki
Zurück zur Übersicht
Seiten: (1)