Forum: Mikrocontroller und Digitale Elektronik Arduino serielles Lesen - brauche Hilfe


von Re M. (lremal)


Lesenswert?

Hallo Forengemeinde,

ich möchte von einem Anzeigegerät einen Wert auslesen und diesen dann 
weiter verarbeiten.

Dazu ein Auszug aus meinem sketch:
1
void setup() {
2
  // Inerruptroutine für pin 2 , funktion ereignistaster wird aufgerufen bei steigender flanke
3
  attachInterrupt(0, ereignisTaster, RISING);
4
5
  // initialize serial port:
6
  Serial.begin(9600, SERIAL_8N1);
7
  Serial1.begin(9600, SERIAL_8N1);
8
}
9
10
11
void loop() {
12
  if (tasterState) {
13
14
    // Istwert ausgeben (Befehl ans das Anzeigegerät)
15
    Serial1.write(escInt);
16
    Serial1.write(aInt);
17
    Serial1.write(nullInt);
18
    Serial1.write(zweiInt);
19
    Serial1.write(nullInt);
20
    Serial1.write(nullInt);
21
    Serial1.write(crInt);
22
    Serial1.write(lfInt);
23
    delay(100);
24
25
    // Istwert ausgeben (Befehl ans das Anzeigegerät)
26
    Serial1.write(escInt);
27
    Serial1.write(aInt);
28
    Serial1.write(nullInt);
29
    Serial1.write(zweiInt);
30
    Serial1.write(nullInt);
31
    Serial1.write(nullInt);
32
    Serial1.write(crInt);
33
    Serial1.write(lfInt);
34
35
    index = 0;
36
    inByte = 0;
37
38
    while (Serial1.available()) // Don't read unless
39
      // there you know there is data
40
    {
41
      if (index < 13){
42
        inByte = Serial1.read(); // Read a character
43
      inIstwert[index] = inByte; // Store it
44
      index++; // Increment where to write next
45
      Serial.println("schreibe");
46
      }
47
      else break;
48
    }
49
50
51
    Serial.println("Das habe ich empfangen: ");
52
    for (int i = 0; i < 13; i++) {
53
      Serial.print(inIstwert[i]);
54
      Serial.print(", ");
55
    }
56
    Serial.println("");
57
58
    tasterState = LOW;
59
  }
60
}
61
62
63
64
65
void ereignisTaster() {
66
67
   // Taster Entprellung - es kann nur 1 mal in der Sekunde der Interrupt ausgeführt werden
68
  if((millis() - alteZeit) > entprellZeit) { 
69
    // innerhalb der entprellZeit nichts machen
70
    tasterState = HIGH;
71
    alteZeit = millis(); // letzte Schaltzeit merken      
72
  } 
73
}


Nun habe ich aber das Problem, dass wenn ich den Istwert am Anzeigegerät 
ändere und ihn dann erneut abfragen möchte, der Arduino diesen nicht bei 
der ersten Abfrage erkennt.
Dazu ein kurzes Beispiel:

Der Wert auf der Anzeige beträgt 10,000.
Frage ich den Wert nun mittels Tastendruck ab so erhalte ich auf dem 
seriellen Monitor:

schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
Das habe ich empfangen:
2, 43, 48, 48, 48, 48, 49, 48, 48, 48, 48, 13, 10,

Änder ich nun den Istwert am Anzeigegerät auf 99,999 so erhalte ich den 
korrekten Wert leider erst bei der zweiten Abfrage:

schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
Das habe ich empfangen:
2, 43, 48, 48, 48, 48, 49, 48, 48, 48, 48, 13, 10,  <--Wert geändert
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
Das habe ich empfangen:
2, 43, 48, 48, 48, 48, 49, 48, 48, 48, 48, 13, 10, <--erste Abfrage
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
schreibe
Das habe ich empfangen:
2, 43, 48, 48, 48, 48, 57, 57, 57, 57, 57, 13, 10,  <--zweite Abfrage

Es kommt auch vor, dass ich den "richtigen" Wert erst nach der dritten 
oder vierten Abfrage erhalte.
Ich kann mir dieses "Fehlverhalten" leider nicht erklären. Ich hoffe 
mein Problem ist verständlich und es kann mir jemand weiterhelfen.

Freundliche Grüße
Markus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.