Hallo liebe Profis..
Beschäftige mich schon seit mehreren Tagen damit von OBD Daten auszulesen, das klappt auch schon recht gut. Das Programm hat folgende Idee.
Ich greife über eine serielle Schnittstelle auf mein Steuergerät zu. Das funktioniert mit den Modembefehlen, atz usw.
Ein Beispiel ist die Motordrehzahl auszulesen.
Diese wird mit dem Befehl
010C
abgefragt. Als Antwort erhalte ich
41 0C 2C 20 <- ( auch mit den Leerzeichen dazwischen)
Die Antwort ist wie folgt aufgebaut.
41 0C ist einfach nur die wiederholte Anfrage und 2C 20 die eigentlichen Daten. So und nun zu meinem Problem.
Da die Ausgabe nur in einem String ist, möchte ich
1. erst beim 3 Byte anfangen zu zählen und 2. das Leerzeichen (zwischen 2C und 20) weglassen.
So das ich dann 2C20 als Antwort habe um diesen dann in Dezimal umrechnen kann.
Das Ergebniss sollte dann 11296 sein.
Und genau um diese Umrechnung geht es...
PS. nicht wundern das die Drehzahl so hoch ist, diese wird am Schluss noch durch 4 geteilt, aber dies sei jetzt mal so dahingestellt.
Ich hoffe ihr hättet da eine Idee wie man das realisieren könnte.
hier mal der Quellcode
Hier steht die Ausgabe vom String ( heißt junk)
Hier ist die Anfrage (das 010C)
Ich wäre euch zu tiefst dankbar, denn ich hänge schon so lange dran und es will einfach nicht klappen.
MFG
Shortyyyy
Beschäftige mich schon seit mehreren Tagen damit von OBD Daten auszulesen, das klappt auch schon recht gut. Das Programm hat folgende Idee.
Ich greife über eine serielle Schnittstelle auf mein Steuergerät zu. Das funktioniert mit den Modembefehlen, atz usw.
Ein Beispiel ist die Motordrehzahl auszulesen.
Diese wird mit dem Befehl
010C
abgefragt. Als Antwort erhalte ich
41 0C 2C 20 <- ( auch mit den Leerzeichen dazwischen)
Die Antwort ist wie folgt aufgebaut.
41 0C ist einfach nur die wiederholte Anfrage und 2C 20 die eigentlichen Daten. So und nun zu meinem Problem.
Da die Ausgabe nur in einem String ist, möchte ich
1. erst beim 3 Byte anfangen zu zählen und 2. das Leerzeichen (zwischen 2C und 20) weglassen.
So das ich dann 2C20 als Antwort habe um diesen dann in Dezimal umrechnen kann.
Das Ergebniss sollte dann 11296 sein.
Und genau um diese Umrechnung geht es...
PS. nicht wundern das die Drehzahl so hoch ist, diese wird am Schluss noch durch 4 geteilt, aber dies sei jetzt mal so dahingestellt.
Ich hoffe ihr hättet da eine Idee wie man das realisieren könnte.
hier mal der Quellcode
Hier steht die Ausgabe vom String ( heißt junk)
Code:
import java.awt.*;
import java.io.*;
import javax.comm.*;
/**
* Subclasses CommPortOpen and adds send/expect handling for dealing with
* Hayes-type modems.
*
*/
public class CommPortModem extends CommPortOpen {
/** The last line read from the serial port. */
protected String response;
/** A flag to control debugging output. */
protected boolean debug = true;
public CommPortModem(Frame f) throws IOException, NoSuchPortException,
PortInUseException, UnsupportedCommOperationException {
super(f);
}
/**
* Send a line to a PC-style modem. Send \r\n, regardless of what platform
* we're on, instead of using println().
*/
protected void send(String s) throws IOException {
if (debug) {
System.out.print("\tAnfrage: " + s);
System.out.println();
}
os.print(s);
os.print("\r\n");
// Expect the modem to echo the command.
if (!expect(s)) {
System.err.println("WARNING: Modem did not echo command.");
}
// The modem sends an extra blank line by way of a prompt.
// Here we read and discard it.
String junk = is.readLine();
System.out.println("\tAntwort: " + junk); //HIER IST DIE AUSGABE DES STRINGS
}
/**
* Read a line, saving it in "response".
*
* @return true if the expected String is contained in the response, false
* if not.
*/
protected boolean expect(String exp) throws IOException {
response = is.readLine();
if (debug) {
}
return response.indexOf(exp) >= 0;
}
}
Hier ist die Anfrage (das 010C)
Code:
import java.io.*;
import java.security.Timestamp;
import java.util.Timer;
import java.util.TimerTask;
import javax.comm.*;
/**
* Dial a phone using the Java Communications Package.
*
*/
public class CommPortDial extends CommPortModem {
boolean bed = true;
public static void main(String[] ap) throws IOException,
NoSuchPortException, PortInUseException,
UnsupportedCommOperationException {
new CommPortDial().converse();
System.exit(0);
}
public CommPortDial() throws IOException, NoSuchPortException,
PortInUseException, UnsupportedCommOperationException {
super(null);
}
protected void converse() throws IOException {
// Send the reset command
System.out.println(new java.sql.Timestamp(new java.util.Date().getTime()));
send("010C");
expect("OK");
}
}
Ich wäre euch zu tiefst dankbar, denn ich hänge schon so lange dran und es will einfach nicht klappen.
MFG
Shortyyyy
Zuletzt bearbeitet: