Go Down

Topic: RX Buffer von esp32 verändern? (Read 486 times) previous topic - next topic

Doc_Arduino

Hier mal ein Fragment, ohne die Schleife.
(und auch ohne if  :o )
doch mit if, auch wenn es im switch case versteckt ist. Auf jeden Fall ohne goto. Aber das war eine andere Baustelle ...   :smiley-mr-green:
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

#16
Mar 23, 2019, 07:04 pm Last Edit: Mar 23, 2019, 08:10 pm by combie
Quote
Auf jeden Fall ohne goto.
:smiley-eek-blue: Nur ein Zufall!  :smiley-eek-blue:
Der nächste Parser kann wieder "mit" sein.
Denn mir gefällt das Return da mitten in dem switch gar nicht.
:smiley-twist:  :smiley-twist:  :smiley-twist:
> Das größte Problem, ist die Wahl der richtigen Gedanken <
Frei nach Dale Carnegie

Doc_Arduino

Hallo,

vom return kommst du weg wenn du statt 2 switch-case nur ein switch-case machst. Also die beiden cases Ende und Zeile mit in obiges einbaust. Dann bleiben obige Zustandsänderungen unter sich. Weil aktuell änderst du den switch case Zustand außerhalb eines switch cases. Das soll man nicht machen. Wenn man größeren Code hat sucht man sich tot wo die Änderungen vorgenommen werden und übersieht möglicherweise etwas.

nicht getestet ungefähr so, dann mußte auch keine wilden Sprünge mit goto machen ...  :smiley-twist:
Code: [Select]
HardwareSerial Serial2(2);

enum ParserResult {Zeile, Ende};

ParserResult parser(Stream &stream,String &buffer)
{
  const String ende("*END*");
  const char endline = '\r';
  int zeichen = stream.read();
  
  switch(zeichen)
  {
    case -1:      break; // Buffer der Datenquelle leer

    case endline: ende ? Ende : Zeile;
                  break;
    
    case Ende:  Serial.println("End Of Data");
                zeile = "";
                break;
    
    case Zeile: Serial.print("Lok: ");
                Serial.println(zeile);
                zeile = "";
                break;
    
    default: buffer += char(zeichen);                  
  }
  
}



String zeile;

void setup()
{
 // while(not Serial);
 // while(not Serial2);
 
 Serial.begin(9600); // Debug
 Serial.println("Start");
 zeile = "";
 
 Serial2.begin(1200); // Steuerung
 Serial2.print("LOCDUMP\r");
}

void loop()
{
  parser(Serial2,zeile);
  
}


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Serenifly

Die Baudrate beträgt 1200 , langsamer geht nicht
Mach dir auch mal klar was das bedeutet. Ein Zeichen braucht 1 / 1200 * 10 Sekunden. 10 wegen 1 Startbit, 8 Datenbits, 1 Stopbit. Also insgesamt etwa 8,3ms pro Zeichen. Das ist extrem viel für einen µC. Deshalb kann man da nicht alles in einer Schleife einlesen.
Das gilt aber auch für viel schnellere Baudraten. Es sei der µC ist mal einige Zeit mit etwas beschäftigt wirst du in der Regel schneller als die serielle Schnittstelle sein. Deshalb immer nachsehen ob Daten da ist, wenn ja verarbeiten und wenn nein was anderes tun (oder nichts)

combie

Quote
wenn du statt 2 switch-case nur ein switch-case machst
Naja, so hast du Eingabe - Verarbeitung - Ausgabe wieder weitreichend verschmolzen, welche ich eigentlich möglichst trennen wollte.
Klar, kann man das machen, verstößt aber, meiner Ansicht nach, gegen das Prinzip: Jede Funktion macht nur ein Ding.



Quote
Dann bleiben obige Zustandsänderungen unter sich. Weil aktuell änderst du den switch case Zustand außerhalb eines switch cases. Das soll man nicht machen.
Das verstehe ich nun gar nicht....
Echt nicht..
> Das größte Problem, ist die Wahl der richtigen Gedanken <
Frei nach Dale Carnegie

Doc_Arduino

Hallo,

Verschmelzung, okay, ist eher ungünstig, wenn die Funktion noch überschaubar bleibt könnte ich damit leben.

Wegen Zustandsänderung an anderer Stelle. Du hast zweimal switch case. Die im zweiten switch benötigten Zustände (Ende, Zeile) werden im ersten switch geändert. Also außerhalb vom zweiten Switch in dem sie benötigt werden.

switch 1:
Code: [Select]
switch(zeichen)
{
  case -1 : break; // Buffer der Datenquelle leer

  case endline :  return buffer == ende ? Ende : Zeile;

  default: buffer += char(zeichen);                  
}

  

switch 2:
Code: [Select]
switch(parser(Serial2,zeile))
{
  case Ende:  Serial.println("End Of Data"); zeile = ""; break;
  case Zeile: Serial.print("Lok: ");Serial.println(zeile); zeile = ""; break;
  default: ;
}
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

Quote
Wegen Zustandsänderung an anderer Stelle. Du hast zweimal switch case. Die im zweiten switch benötigten Zustände (Ende, Zeile) werden im ersten switch geändert. Also außerhalb vom zweiten Switch in dem sie benötigt werden.
Ja, das ist so!
Auch wenn dir dieser Rückgabe Wert komisch erscheint .....

Der Parser sendet der aufrufenden Funktion eine Statusmeldung.
Die aufrufende Funktion kann dann angemessen darauf reagieren.
Mir scheint, dass damit der Sinn und Zweck eines Rückgabewertes, einer Funktion, voll und ganz erfüllt wird.

Hmmm...
"Verbesserungswürdig", hatte ich schon gesagt....

Viellicht bist du auch so überrascht, weil ich das Ding nicht in ein OOP Mäntelchen gesteckt habe. Denn dann würde es vermutlich anders aussehen. Also "gewöhnlicher", eher meinem normalen Stil entsprechend.
> Das größte Problem, ist die Wahl der richtigen Gedanken <
Frei nach Dale Carnegie

Go Up