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
mehrere Bytes seriell einlesen. Verständnisprobleme
15.12.2018, 18:21
Beitrag #1
mehrere Bytes seriell einlesen. Verständnisprobleme
Hallo,
vorab, ich bin Elektroniker, kein Programmierer, ich taste mich langsam heran, kleine Projekte funktionieren und verstehe ich auch bisher 100%ig. Ein Profi wird evtl. schmunzeln, aber ich kriegs nicht hin.Huh

Ich möchte Datenblöcke der Form: 06 FF XX XX XX mit 115200Baud mit ca. 10ms Pause zwischen den Blöcken einlesen und die letzten 3 Bytes (XX XX XX) auswerten und anzeigen. (Es handelt sich um Telemetriedaten im MSB Format, d.h. Multiplex-Sensor-Bus, wenn ich das richtig in Erinnerung habe)

Das Problem, ich bekomme das nicht hin, sicher weil ich das noch nicht verstehe. Das einlesen eines Zeichens ist kein Problem, es gibt zuhauf Tutorials und Beispiele. Bei mehreren Bytes wirds mit Erklärungen sehr eng. Ich erhalte jedenfalls nur Datenschrott und habe keine Erklärung dafür.
Ich könnte euch mehrere vergebliche Code-Versuche posten und mir das korrigieren lassen. Das will ich nicht, ich wills erst verstehen.

Diese Fragen habe ich erstmal, bzw. das sind meine Rechercheergebnisse:

1. Serielle Daten werden grundsätzlich erst in einem Puffer abgelegt und von dort aus mit Serial.read gelesen. Korrekt?
2. Nach dem Lesen eines Zeichens wird genau dieses Zeichen im Pufferspeicher gelöscht. Korrekt?
3. Das würde bedeuten, es sind angenommen 5 Bytes im Puffer, ich lese eines mit Serial.read, dann ist das erste Zeichen im Puffer gelöscht, es befinden sich noch 4 weitere Bytes im Speicher. Korrekt?
4. Wenn 3. Korrekt ist, kann man so:

for (int i=0; i <= 4; i++) {
empfBytes[i] = Serial.read();
}

in einem Rutsch alle 5 Bytes auslesen und im Array speichern? Gleichzeitig damit den Puffer löschen?

Bis hier erstmal,
Danke, Rene
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2018, 18:45
Beitrag #2
RE: mehrere Bytes seriell einlesen. Verständnisprobleme
Ja, das hast Du richtig erkannt. Evtl. hilft Dir Serial.available() auch zusätzlich weiter. Es gibt die Anzahl der vorhandenen Zeichen im Puffer zurück. Damit kannst Du checken, ob schon 5 Zeichen da sind.

MSB kenne ich eher als most significant bit.

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
15.12.2018, 22:48
Beitrag #3
RE: mehrere Bytes seriell einlesen. Verständnisprobleme
Mit Serial.Readbytes kann man auch wrten, bis eine bestimmte Anzahl Zeichen eingegangen ist oder Timeout war.

Gruß
GuaAck
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.12.2018, 13:41
Beitrag #4
RE: mehrere Bytes seriell einlesen. Verständnisprobleme
Vielen Dank schon mal, immerhin liege ich ja wohl in meinen Vorüberlegungen nicht falsch.
als nächstes hab ich auf einem 2. Arduino drei solcher Blöcke 06 FF XX XX XX nachgebaut (und mit realen Daten gefüllt) und vorerst, um genau die Wirkung zu verfolgen, die 10ms Pause auf 1000 ms gesetzt.
mit If Serial.available == 5 starte ich die o.g. Schleife
nach meinem Verständnis ist die Bedeutung " Sobald 5 Zeichen im Buffer sind, dann alle 5 lesen, im Array ablegen, anschliessend löschen"

@ GuaAck: Serial.Readbytes ist mir neu, ich werde mich nachher einlesen, danke!!
aber das sollte doch auch so funktionieren..

Das ist mein vorerst letzter Versuch:
Code:
#include <SoftwareSerial.h>
SoftwareSerial Nextion(10, 11);                  // Software Serial fuer Nextion



int empfBytes[4];                               // Array für 5 Bytes

boolean newData = false;
byte NexTerminator[3] = {255, 255, 255};        // Schliesst einen Befehl zum Nextion ab


void setup() {
  

  
  Serial.begin(115200);                         // Datenrate HardwareSerial port
  
  Nextion.begin(9600);                          // Datenrate SoftwareSerial port fuer Nextion Display
        
    

}

void loop() {

    
      if (Serial.available() == 5 &&  newData == false)                    
        {
         for (int i = 0; i <= 4; i++) {
         empfBytes[i] = Serial.read();
         }

         newData = true;
        
        }
    
      
      if (newData == true)
      {
        Nextion.print("t5.txt=\"");
        Nextion.print(empfBytes[0],HEX);
        Nextion.print('"');
        Nextion.write(NexTerminator, 3);
        
        Nextion.print("t6.txt=\"");
        Nextion.print(empfBytes[1],HEX);
        Nextion.print('"');
        Nextion.write(NexTerminator, 3);

        Nextion.print("t7.txt=\"");
        Nextion.print(empfBytes[2],HEX);
        Nextion.print('"');
        Nextion.write(NexTerminator, 3);

        Nextion.print("t8.txt=\"");
        Nextion.print(empfBytes[3],HEX);
        Nextion.print('"');
        Nextion.write(NexTerminator, 3);

        Nextion.print("t9.txt=\"");
        Nextion.print(empfBytes[4],HEX);
        Nextion.print('"');
        Nextion.write(NexTerminator, 3);
      
        newData = false;
      }        
  }

Das Ergebnis müsste sein, dass ich im Sekundentakt die einkommenden Bytes sehe, das Ergebnis ist aber weder Sekundentakt, (zuweilen 2 oder 3 Sekunden) und die angezeigten Bytes haben nichts, aber auch gar nichts mit der Quelle zu tun.
Das kann doch nicht so schwer sein.
Ich sehe gerade während des Compilierens folgenden Warnhinweis:
Test_5Bytes_lesen.ino:37:38: warning: iteration 4 invokes undefined behavior [-Waggressive-loop-optimizations]

empfBytes[i] = Serial.read();

Was ist denn das? Ist mir bisher nicht aufgefallen
Danke und schönen Sonntag!
Mosi
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.12.2018, 14:55
Beitrag #5
RE: mehrere Bytes seriell einlesen. Verständnisprobleme
Gib doch erst mal die empfangenen Werte auf den seriellen Monitor aus und schaue, was da wirklich ankommt.

Wenn Du die unnötigen Leerzeilen weg läßt, wird der Code übersichtlicher.
Die Warnung passt nicht zum Code im Forum. Warnungen kann man erst mal ignorieren, ansonsten vermute ich, dass er sich an dem int stört.
Probiere mal for(byte i = 0;...)

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
16.12.2018, 15:08 (Dieser Beitrag wurde zuletzt bearbeitet: 16.12.2018 15:14 von MicroBahner.)
Beitrag #6
RE: mehrere Bytes seriell einlesen. Verständnisprobleme
(16.12.2018 13:41)Mosi schrieb:  
Code:
int empfBytes[4];                               // Array für 5 Bytes
Du definierst hier nur ein Array mit 4 Byte! In der Schleife lässt Du den Index aber über 5 Elemente laufen - da will dich der Compiler drauf hinweisen. Man kann die Schleife auch so aufbauen, dass sie automatisch über die 'echte' Länge des Arrays läuft. Wäre hier aber auch falsch, da ja die Arraylänge falsch definiert ist.

Wie synchronisierst Du denn auf die 'richtigen' 5 Byte. Da Du weder ein Starbyte auswertest, noch irgendwelches Timing ( die Pausen zwischen den Blöcken ), ist es vom Zufall bzw. von der Startreihenfolge der beiden Arduinos abhängig welche 5 Byte du erwischt.

P.S. Wie hast Du denn die beiden Arduinos verbunden. Die HW-serielle ist ja bei den meisten für die Verbindung zum PC reserviert . Welche Arduinos setzt Du ein?

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.12.2018, 18:37 (Dieser Beitrag wurde zuletzt bearbeitet: 16.12.2018 18:52 von Mosi.)
Beitrag #7
RE: mehrere Bytes seriell einlesen. Verständnisprobleme
Ich näher mich...
Zitat:Du definierst hier nur ein Array mit 4 Byte! In der Schleife lässt Du den Index aber über 5 Elemente laufen
böse Falle, Danke. Ich dachte, 5 Elemente, also von 0 - 4, ergo [4]
das steht so in der Arduino Referenz:
"int myArray[5]; // deklariert Datentyp 'integer' als Array mit 6
Positionen"

jetzt werden auch schon mal 5 "richtige" HEX's ausgegeben, das Byte 5 war immer totaler Quatsch..(4Stellig)
Auch ist der Warnhinweis weg.
Zitat:Gib doch erst mal die empfangenen Werte auf den seriellen Monitor aus und schaue, was da wirklich ankommt.
Hab ich gemacht, genau das gleiche Problem

Zitat:P.S. Wie hast Du denn die beiden Arduinos verbunden. Die HW-serielle ist ja bei den meisten für die Verbindung zum PC reserviert . Welche Arduinos setzt Du ein?
Das war auch schon eine Überlegung...
ich setze einen Uno ein, HW-Serielle zum 115200 lesen, Software-Serial für Nextion. Umgedreht geht wohl nicht, da Software Serial Speed-Einschränkungen hat.
Den Uno will ich später mit nem Nano ersetzen, Wegen Platzmangel

Als Sender hab ich einen Mega. Ich werde mal tauschen, dann kann ich ausschliesslich HW-Serielle verwenden

Zitat:Wie synchronisierst Du denn auf die 'richtigen' 5 Byte. Da Du weder ein Starbyte auswertest, noch irgendwelches Timing ( die Pausen zwischen den Blöcken ), ist es vom Zufall bzw. von der Startreihenfolge der beiden Arduinos abhängig welche 5 Byte du erwischt.
Im Moment synchronisiere ich nichts, Ich schalte beide an, ohne serielle Verbindung, später verbinde ich, in der Hoffnung, dass ich die 999,4ms lange Pause erwische und nicht die 0,6ms...
Später werde ich die Zeichenkette 06FF als Startmarker verwenden, daraufhin die folgenden 3 Bytes einlesen. Ist so meine Überlegung. Im Moment wäre ich aber froh, überhaupt was vernünftiges auszulesen.
Danke Allen!
ich experimentiere noch ein wenig

Ursache gefunden!!! ich hab mal probeweise die Baudraten auf 9600 gesetzt. Alles Super!!!
Jetzt muss ich die Kumpels dazu kriegen, auch 115200 zu verstehen. Aber nicht mehr heute.
Danke!!!!
Grüße, Rene
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.12.2018, 18:53
Beitrag #8
RE: mehrere Bytes seriell einlesen. Verständnisprobleme
(16.12.2018 18:37)Mosi schrieb:  das steht so in der Arduino Referenz:
"int myArray[5]; // deklariert Datentyp 'integer' als Array mit 6
Positionen"
Also in der mir vorliegenden deutschen Arduino-Referenz steht das anders:
Zitat:int myArray[5]; // deklariert Datentyp 'integer' als Array mit 5
Positionen (von 0 bis 4)

Evtl. mal schauen, ob Du eine veraltete Version hast.

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
  1 Knopf, mehrere Funktionen Muff4 2 216 23.10.2019 17:12
Letzter Beitrag: Muff4
  8 Bit als Variable Parallel einlesen Holzauge 2 540 13.08.2019 21:51
Letzter Beitrag: Holzauge
  Bytes & more Hilgi 18 1.232 28.04.2019 18:11
Letzter Beitrag: Hilgi
  Mehrere HX711 mit einem Arduino Uno be14b029 8 4.234 16.03.2019 18:22
Letzter Beitrag: charlie883
  Variable auf zwei Bytes aufteilen ? huber5093 4 836 05.03.2019 20:17
Letzter Beitrag: Tommy56
  PWM/PPM einlesen lockenkopf 2 575 05.03.2019 14:25
Letzter Beitrag: lockenkopf
  Zahl aus txt-Datei als globale Variable einlesen Lance101 17 1.367 16.02.2019 14:38
Letzter Beitrag: Tommy56
  SPI Schnittstellen für mehrere Geräte nutzen Hoffmakl 11 1.529 31.01.2019 15:41
Letzter Beitrag: Hoffmakl
  Multiple Serielle Bytes mit Startmarke synchronisieren, was mache ich falsch Mosi 8 1.073 20.12.2018 18:33
Letzter Beitrag: Mosi
  mehrere leds blinken jennerlein 1 721 18.12.2018 09:25
Letzter Beitrag: hotsystems

Gehe zu:


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