Hallo, ich versuche ein ELM327 mit einem Arduino zu steuern. Zuerst manuell über Hterm getestet:
1 | >ATZ |
2 | |
3 | ELM327 v1.3a |
4 | |
5 | >atrv |
6 | 12.6V |
7 | |
8 | >atsp0 |
9 | OK |
10 | |
11 | >0100 |
12 | SEARCHING... |
13 | 41 00 BE 3E B8 00 |
14 | |
15 | >010c |
16 | 41 0C 00 00 |
17 | |
18 | >010c |
19 | 41 0C 12 54 |
20 | |
21 | >010c |
22 | 41 0C 11 B0 |
23 | |
24 | >010c |
25 | 41 0C 11 AC |
Jetzt versuche ich das gleiche mit diesem Programm zu erreichen, was nicht klappt. Ich bekomme keine Werte ausgegeben. Jemand eine Idee warum?
1 | #include <SoftwareSerial.h> |
2 | |
3 | // RX, TX --> debug |
4 | SoftwareSerial softwareSerial(4, 5); |
5 | |
6 | |
7 | void setup() { |
8 | softwareSerial.begin(19200); |
9 | Serial.begin(9600); |
10 | |
11 | delay(1500); |
12 | |
13 | softwareSerial.println("boot"); |
14 | |
15 | //Reset the OBD-II-UART |
16 | readOBDId("ATZ\r", 0); |
17 | delay(5000); |
18 | |
19 | // no echo |
20 | readOBDId("ATE0\r", 0); |
21 | delay(1000); |
22 | |
23 | // no linefeed |
24 | readOBDId("ATL0\r", 0); |
25 | delay(1000); |
26 | |
27 | // auto detect protocol |
28 | readOBDId("ATSP0\r", 0); |
29 | delay(5000); |
30 | |
31 | // auto detect protocol |
32 | readOBDId("0100\r", 0); |
33 | delay(5000); |
34 | |
35 | softwareSerial.println("boot done"); |
36 | } |
37 | |
38 | // -------------------------------------------------------------------// |
39 | String readOBDId(String id, int numBytes){ |
40 | Serial.print(id); |
41 | Serial.flush(); |
42 | |
43 | String data = ""; |
44 | String result =""; |
45 | char inChar; |
46 | // only if there are bytes in the serial buffer execute the following code |
47 | while(true) { |
48 | if(Serial.available()) { |
49 | |
50 | //keep reading and printing from serial untill there are bytes in the serial buffer |
51 | while (Serial.available()>0){ |
52 | inChar = Serial.read(); //read Serial |
53 | if(inChar == '\r' || inChar == '\n') { |
54 | break; |
55 | } |
56 | data += String(inChar); |
57 | result = data; |
58 | } |
59 | |
60 | softwareSerial.print("raw data: "); |
61 | softwareSerial.println(data); |
62 | |
63 | if(result.length() > 4 && numBytes > 0) { |
64 | int pos1 = data.indexOf(id); |
65 | result = data.substring(pos1+3, pos1+(numBytes*2)+4); |
66 | result.replace(" ", ""); |
67 | } |
68 | |
69 | softwareSerial.print("processed data: "); |
70 | softwareSerial.println(result); |
71 | return result; |
72 | } |
73 | else { |
74 | delay(20); |
75 | } |
76 | } |
77 | } |
78 | |
79 | void loop() { |
80 | String rpm = readOBDId("010C\r", 2); |
81 | softwareSerial.print("rpm: "); |
82 | softwareSerial.println(rpm); |
83 | |
84 | delay(4000); |
85 | } |