INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Multiple Serielle Bytes mit Startmarke synchronisieren, was mache ich falsch
19.12.2018, 18:39
Beitrag #1
Multiple Serielle Bytes mit Startmarke synchronisieren, was mache ich falsch
Hi,
ich möchte 5 Bytes der Form 06 FF XX XX XX einlesen.
Das hier funktioniert, beginnt natürlich irgendwo,
Code:
if (Serial.available() == 5 &&  newData == false)                    
        {
         for (int i = 0; i <= 4; i++) {
         empfBytes[i] = Serial.read();
         }
         newData = true;
        }

Die ersten beiden Bytes sind immer 06 FF, nur die drei folgenden sind für mich von Interesse. Also FF wird mein Startmarker. mein Sohn hat gestern im vorbeigehen dieses eingetippt:
Code:
if (Serial.available() > 0 &&  newData == false)
  {
  mark = Serial.read();
    if(mark == 0xFF)
    {
    i = 0;
        do
        {
           empfBytes[i] = Serial.read();
           //Serial.print(i, DEC);
           //Serial.println(empfBytes[i], HEX);
           i++;
        }
        while (i != 3);
    }
      newData = true;
  }
es hat auch auf Anhieb funktioniert, nur habe ich heute daran rumgefummelt, irgendwas ist falsch, ich habe im empfBytes[0] das erste Byte, im empfBytes[1] allerdings das Dritte! im letzten Element befindet sich totaler Quatsch (-FFFFFFF)
Was hab ich da gemacht, ich kann keinen Fehler finden.
Ich habs noch mal für mich Idiotensicher umgeschrieben:

Code:
if (Serial.available() > 0 &&  newData == false){                    
        mark = Serial.read();
           if (mark == 0xFF) {
             empfBytes[0] = Serial.read();
             empfBytes[1] = Serial.read();
             empfBytes[2] = Serial.read();
           }
           newData = true;    
      }
Das ist das identische Verhalten: das zweite Byte wird schlichtweg ignoriert.
Hat jemand ne Idee? mein Sohn kommt erst wieder am WochenendeBig Grin
Grüße! Rene
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.12.2018, 18:58 (Dieser Beitrag wurde zuletzt bearbeitet: 19.12.2018 19:00 von Tommy56.)
Beitrag #2
RE: Multiple Serielle Bytes mit Startmarke synchronisieren, was mache ich falsch
Du hast keine Garantie, dass nach Empfang von FF schon die anderen Bytes da sind.
Ungetestet:
Code:
byte puffer[3];

// Return true, wenn die 3 Zeichen nach FF eingelesen sind
// sonst false
bool lese() {
  static byte idx = 0;
  static bool merk = false;
  if (Serial.available()) {
   byte b = Serial.read();
   if (b == 0xFF) merk = true;
   if (merk) {
    puffer[idx++] = b;
    if (idx < 3) return false;
    else {
      merk = false;
      idx = 0;
    }
   }
  }
  return false;
}

void loop() {
  if (lese()) {
    // mach was mit den Daten
  }
}
Das blockiert nicht, bis die Daten alle da sind sondern liest in jedem Loop-Durchlauf ein Zeichen ein. Voraussetzung ist, der Loop wird nicht durch delay oder lang laufende Schleifen blockiert.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.12.2018, 14:37 (Dieser Beitrag wurde zuletzt bearbeitet: 20.12.2018 15:12 von Mosi.)
Beitrag #3
RE: Multiple Serielle Bytes mit Startmarke synchronisieren, was mache ich falsch
Danke Tommy,
dein code ist totales Neuland für mich, bevor ich mich da ranmache um das zu verstehen, ein paar Fragen und Bemerkungen:
die Blöcke werden mit 115200Baud gesendet, mit ca. 10ms Pause, ich will sie lesen, aufbereiten und zum Display schicken.
Was heisst das, Blockieren? Der Arduino ist nur mit warten auf serielle Daten beschäftigt?
Das wäre ja ok, die 10ms reichen doch locker aus um (fast) alles in der Welt zu tun. wenn kein neuer Datenblock ankommt, hat der Arduino eh nichts zu tun als zu warten. Andererseits benötige ich immer alle 3 bytes, um überhaupt etwas zur Anzeige zu bringen.
Zitat:Du hast keine Garantie, dass nach Empfang von FF schon die anderen Bytes da sind.
Das verstehe ich nicht, m.W. wartet das Programm nach der Stelle "if(mark == 0xFF)" mit dem Befehl Serial.read auf das nächste Byte? egal wie lange das dauert?
Und dieses Byte wird ja auch immer korrekt gelesen. Nur eben das Zweite nicht!

Ich habe übrigens mit einem zweiten Arduino als Sender die Sequenz nachgebaut, die 3 interessanten Bytes habe ich benannt: "A1, A2, A3; B1, B2, B3;" usw. Das Resultat ist immer: "A1, A3, FFFFFFFF; B1, B3, FFFFFFFF; usw.

Für das Verstehen deines Codes hole ich mir jetzt ne Flasche Rotwein und werde vermutlich das Sofa den Rest des Tages blockieren. Danke nochmals!!

Ich hab gerade ein Experiment gemacht, ich dachte, die Daten kommen zu schnell rein, deswegen überspringt das Programm ein Byte, siehe da: bei 9600 Baud funktionierts!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.12.2018, 15:12
Beitrag #4
RE: Multiple Serielle Bytes mit Startmarke synchronisieren, was mache ich falsch
(20.12.2018 14:37)Mosi schrieb:  Das verstehe ich nicht, m.W. wartet das Programm nach der Stelle "if(mark == 0xFF)" mit dem Befehl Serial.read auf das nächste Byte? egal wie lange das dauert?
Falsch. Wenn nichts da ist, liefert Serial.read einen Int von -1 zurück und weiter geht es. 0xFF ist als Byte = -1.

Wenn Du aller 10 ms eine andere Ausgabe aufs Display bringst, wirst Du außer Flimmern überhaupt nichts sehen. Das ist für die Kombination Auge+Hirn zu schnell.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.12.2018, 16:14
Beitrag #5
RE: Multiple Serielle Bytes mit Startmarke synchronisieren, was mache ich falsch
Zitat: Wenn nichts da ist, liefert Serial.read einen Int von -1 zurück und weiter geht es. 0xFF ist als Byte = -1.
Idea Heureka! Das habe ich noch nicht gewusst und erklärt vieles!!
Zitat:Wenn Du aller 10 ms eine andere Ausgabe aufs Display bringst, wirst Du außer Flimmern überhaupt nichts sehen. Das ist für die Kombination Auge+Hirn zu schnell.
Einfach nur aufs Display bringen, klar da hast du recht. Aber hier handelt es sich um die Abfrage von bis zu 15 Sensoren, die auf dem Display in 15 Feldern, bzw. Skalen ihre nach Adressen und Masseinheiten sortierten Daten ausgeben sollen. Da auch noch jede Menge 0-Datenblöcke übertragen werden (Nach jeweils 2 gültigen Blöcken kommen 3 Blöcke mit 00 00 00) ist der Gesamtzyklus ca. 300 - 500 ms lang. das wäre sogar wenig für die flüssige Darstellung einer z.B. Zeigerbewegung...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.12.2018, 16:23
Beitrag #6
RE: Multiple Serielle Bytes mit Startmarke synchronisieren, was mache ich falsch
(20.12.2018 16:14)Mosi schrieb:  Einfach nur aufs Display bringen, klar da hast du recht. Aber hier handelt es sich um die Abfrage von bis zu 15 Sensoren, die auf dem Display in 15 Feldern, bzw. Skalen ihre nach Adressen und Masseinheiten sortierten Daten ausgeben sollen. Da auch noch jede Menge 0-Datenblöcke übertragen werden (Nach jeweils 2 gültigen Blöcken kommen 3 Blöcke mit 00 00 00) ist der Gesamtzyklus ca. 300 - 500 ms lang. das wäre sogar wenig für die flüssige Darstellung einer z.B. Zeigerbewegung...
Die Info hast Du uns vorenthalten. Wir können nur das beurteilen, was wir an Infos von Dir bekommen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.12.2018, 17:58
Beitrag #7
RE: Multiple Serielle Bytes mit Startmarke synchronisieren, was mache ich falsch
Ok. Sorry, ist ein bisschen egoistisch von mir, nur eine Detaillösung für mich zu suchen.
Dann hier in Kurzform mein Gesamtprojekt:
Ich möchte den Multiplex-Sensor-Bus auslesen (dient zur Übertragung von Telemetriedaten von ferngesteuerten Modellen zum Sender nachfolgend kurz MSB genannt), und die Daten auf einem Extra-Display (Nextion) am Sender weitestgehend graphisch darstellen.
Das Originaldisplay kann nur 3 Werte gleichzeitig anzeigen, und das auch nur mit Anzeige des Wertes und der Einheit, nicht aber, was ich messe.
Hier ist es noch relativ überschaubar:
   
wenn aber 3 ähnliche Werte z. B 336m, 348m, 25m, auf einer Seite stehen, wirds eng mit der Interpretation, Was ist was? Höhe? Entfernung? Entfernung über Grund? Das kann man sich nicht merken, wenn man verschiedene Modelle hat, mit verschiedenen Sensoren. Bis hierhin ist es nicht so überlebenswichtig, aber:
Kritisch wirds, wenn ich einen GPS Sensor verwende, der mir die Richtung von Nord zum Modell, als auch die Flugrichtung des Modells anzeigt. Bei plötzlicher schlechter Sicht, können diese Infos das Modell retten. Wenn ich aber 1. gerade jetzt auf eine falschen Anzeigeseite bin und/oder 2. nicht mehr genau weiß, (Panik!!) welches von diesen beiden Grad-Angaben welche Funktion hat, kann das das Modell kosten. (Ist mir passiert, deswegen der ganze Aufwand)
Also: Alles auf einer Seite darstellen, die Winkel (Richtung und Flugrichtung) will ich grafisch darstellen.
Das Protokoll MSB-Modellseitig ist von der Fa. Multiplex offengelegt worden, das Protokoll Senderseitig nicht.
Das war meine Initialzündung: http://www.icplan.de/seite30.htm
Das geht aber mit heute noch besser.
Das Protokoll habe ich überprüft, geringe Abweichungen habe ich festgestellt, sind aber nicht wesentlich.
Entscheidend sind die 3 o.g. Bytes nach den 06 FF, das erste für Sensoradresse und Masseinheit, die anderen beiden für die eigentlichen Daten. Diese 5 Bytes werden mit 115200 Baud übertragen mit ca. 10, oder 12 ms Pause. Die 115200 kann ich nicht ändern.
Also mein Plan ist:
-Bytes lesen bis FF kommt,
-die nächsten 3 Bytes in ein Array lesen.
-auf Gültigkeit überprüfen (Wenn Summe == 0, dann gibts nichts zu zeigen)
-Sortieren nach Adressen, Maßeinheiten, skalieren in reale Werte
-schicken zu den enspr. Objekten zum Nextion
Die letzten drei Punkte hab ich schon im Kleinen simuliert, das kriege ich hin
Punkt 1 eigentlich auch, nur Punkt 2 funktioniert nur mit 9600 Baud. wenns schneller wird, verschluckt das Programm das ankommende Byte 2, im Byte 3 landet nichts. (Ich habs geschnallt! Danke Tommy)
Grüße! Rene
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.12.2018, 18:10
Beitrag #8
RE: Multiple Serielle Bytes mit Startmarke synchronisieren, was mache ich falsch
(20.12.2018 17:58)Mosi schrieb:  Ich habs geschnallt!
Soll das die Info am Rande sein, dass es jetzt geht?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Variable auf zwei Bytes aufteilen ? huber5093 4 288 05.03.2019 20:17
Letzter Beitrag: Tommy56
  mehrere Bytes seriell einlesen. Verständnisprobleme Mosi 9 685 19.12.2018 16:07
Letzter Beitrag: Mosi
  Serielle Daten Windigipet 2018 Software, Arduino Mega 2560 verarbeiten/melden Christian_Moba-Arduino 11 1.801 15.09.2018 09:43
Letzter Beitrag: MicroBahner
  PHP WINDOWS XAMPP ARDUINO UNO SERVO steuern über Serielle Verbindung tr3 1 431 21.08.2018 21:59
Letzter Beitrag: georg01
  was ist falsch? (c++) uweq 36 3.183 18.07.2018 15:55
Letzter Beitrag: Mathias
  AnalogRead zwischendurch falsch Mathias 5 926 18.03.2018 17:07
Letzter Beitrag: Mathias
  Bits und Bytes Blumfeld 19 2.479 10.03.2018 11:12
Letzter Beitrag: fraju
  2 Befehle über Serielle Schnittstelle interpretieren phischmi 14 2.595 04.12.2017 08:52
Letzter Beitrag: phischmi
  I2C.ccp - Multiple Definition ? Stargazer 6 1.799 06.08.2017 19:22
Letzter Beitrag: Stargazer
  Fragen :serielle eingabe und Externe Interrupts Treeshort 7 1.301 02.06.2017 16:52
Letzter Beitrag: MicroBahner

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste