Arduino serielles Lesen - brauche Hilfe

OP #4664146
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.