OBD Schnittstelle in C - KW1281
-
Hallo,
ich habe ein kleines Projekt vor. Ich möchte in C das KW1281 Protokoll realisieren. Das KW1281 Protokoll wird für Fahrzeugdiagnosen genutzt und über eine serielle COM-Schnittstelle am Rechner und der OBD-Buchse am Auto kommuniziert.
Informatoinen zum KW1281 Protokoll: http://www.blafusel.de/obd/obd2_kw1281.html
Zunächst möchte ich eine einfache Verbindung herstellen und die Bezeichnung des Motorsteuergeräts auslesen.
Daher fasse ich kurz die Informationen zum KW-Protokoll zusammen...
1. KW1281-Initialisierung (blafusel.de):
Um mit dem Controller zu kommunizieren muss dieser aufgeweckt werden,
sodass er weiß man will mit ihm kommunizieren (Niedrige Baudrate 5Bd, 7O1).Auszug aus Portmon (blafusel.de):
IOCTL_SERIAL_SET_BREAK_ON IOCTL_SERIAL_SET_RTS IOCTL_SERIAL_CLR_DTR IOCTL_SERIAL_SET_BREAK_OFF -> Start-Bit? IOCTL_SERIAL_CLR_RTS IOCTL_SERIAL_SET_BREAK_ON -> 0 IOCTL_SERIAL_SET_RTS IOCTL_SERIAL_SET_BREAK_ON -> 0 IOCTL_SERIAL_SET_RTS IOCTL_SERIAL_SET_BREAK_ON -> 0 IOCTL_SERIAL_SET_RTS IOCTL_SERIAL_SET_BREAK_ON -> 0 IOCTL_SERIAL_SET_RTS IOCTL_SERIAL_SET_BREAK_ON -> 0 IOCTL_SERIAL_SET_RTS IOCTL_SERIAL_SET_BREAK_ON -> 0 IOCTL_SERIAL_SET_RTS IOCTL_SERIAL_SET_BREAK_ON -> 0 IOCTL_SERIAL_SET_RTS IOCTL_SERIAL_SET_BREAK_OFF -> 1 IOCTL_SERIAL_CLR_RTS IOCTL_SERIAL_SET_DTR
Die Kommunikation zur Initialisierung sieht folgendermaßen aus:
vom µC von ECU Beschreibung 0x01 5 Baud Adresse des Steuergerätes 0x55 Sync Byte zum festlegen der Baudrate 0x01 key word LSB (low significant byte) 0x8A key word HSB (high significant byte) 0x75 Komplement zur 0x8A
2. Kommunikation (blafusel.de):
Die eigentliche Kommunikation erfolgt mit üblicherweise 4800, 9600 oder 10400 Baud, 8N1.3. Übertragung der Gerätedaten (blafusel.de):
Nach dem das Steuergerät bereit ist, startet die Übertragung der
Gerätespezifikation. Hierbei meldet sich das Steuergerät folgendermaßen.vom µC von ECU Beschreibung 0x0F block length (s. u.); ECU ist Master 0xF0 Komplement 0x01 block counter (s. u.) 0xFE 0xF6 block title (s. u.) 0x09 0x30 ASCII Wert für "0" 0xCF 0x33 "3" 0xCC 0x30 "0" ... 0xBA 0x20 " " (Leerzeichen) 0xDF 0x20 " " 0xDF 0x03 block end (s. u.)
Jetzt zu meinen Fragen:
Wie kann ich diese Initialisierung in C realisieren?
Wie kann ich das Timing einhalten?
Was bedeutet 7O1 bzw. 8N1? - 7 Bits mit Stoppbit und Parität, 8 Bits ohne Parität und mit Stoppbit?Mein Code bisher:
http://pastebin.com/6DZRjWKnPS: Das Kabel zur Kommunikation zwischen COM-Port und OBD ist ein USB-Kabel und als lokaler COM-Port gemappt.
Falls jemand diesen Halbroman bis hierher gelesen haben sollte: Danke!
Gruß
COMedy
-
Achso, hab ich fast vergessen...
OS: WinXP 32bit
-
währe eine möglichkeit... schon mal in irgend einer form rs232 gemacht ? so aufm avr oder so ? in linux iss das easy... quasie wie ne textdatei....
Mfg McMorf
-
welchen compiler benutzt du ? visualc++ ?