Programm für Serielle Schnittstelle/Wie empfangene Daten kürzen!?

Guten Abend.

ANFÄNGER BENÖTIGT HILFE!!
Ich habe ein Programm geschrieben um mir über einen Display anzeigen zu lassen in welchem Zimmer welches Fenster auf ist bzw. geöffnet wurde.

char Daten;                 // Variable Daten als Datentyp char

void setup() {
  Serial.begin(9600);      // Schnnittstelle mit 9600 Baud
  //mySerial.begin(9600);   // Schnnittstelle mit 9600 Baud

}

void loop() {

  if (Serial.available()) {
    Daten = Serial.read();
    Serial.print(Daten);






    

   
    
    
  }

}

Mit diesem Programm arbeite ich und es funktioniert auch.
Ich bekomme folgendes auf dem Display angezeigt:


017: 09.Nov 18:44
Fenster
10/1 Fenster


Jetzt benötige ich Hilfe, denn ich möchte als empfangene Daten lediglich 10/1 oder 10/1 Fenster angezeigt bekommen.

Kann mir bitte jemand Hilfestellung geben und vllt ein Sketch als Beispiel zeigen, wie ich das Problem angehe?

Vielen Dank

Warum fängst Du mit dem Unsinn einen neuen Thread an?

Du hast doch hier schon Antworten bekommen.

Den Titel des ersten Beitrags kannst Du auch nachträglich ändern.

Hast Du vor, Dich mit Gewalt unbeliebt zu machen?

Gruß Tommy

Schon bei deinem ersten Versuch wurdest du gefragt, warum du SoftwareSerial auf der Hardware Serial benutzt und anschließend dann doch nur die serielle Schnittstelle.
Warum beantwortest du du Frage nicht und machst den selben Fehler wieder ?

Für mich ist es kein Unsinn, aber Danke.
Bei meinem letzten Thread wurde mir nicht wirklich geholfen, da ich Anfänger bin!

Warum ich es von SoftwareSerial auf Hardware Serial benutze?... Hab ich gar nicht drüber nachgedacht, sondern einfach gemacht und hat funktioniert.
Alles was ich benötige ist ein Beispiel Sketch, wie ich die empfangenen Daten kürzen kann.

Wenn man programmiert, sollte man schon darüber nachdenken, was man macht, sonst fällt einem das direkt auf die Füße.

Nimm das bitte mal direkt aus dem Sketch raus, damit da nicht noch weitere Probleme auftreten.

Was das Kürzen betrifft, wurde dir im vorherigen Thread auch schon eine Antwort gegeben.
So ist das, wenn man nicht alles ließt und eigene Teile einfach löscht.

User1809:
Alles was ich benötige ist ein Beispiel Sketch, wie ich die empfangenen Daten kürzen kann.

Alles, was Du benötigst, sind erst mal die primitivsten Grundkenntnisse, um die Hilfestellungen überhaupt verstehen zu können.

Das Du es nicht verstehen kannst hat Du gerade mit diesem Posting bewiesen.

Gruß Tommy

Hi

Im Allgemeinem wird hier - gerade Anfängern - eigentlich sehr oft geholfen.
Also ist Deine Aussage, daß Dir nicht geholfen wurde, WEIL DU ANFÄNGER BIST, schon Mal nicht so ganz korrekt.

Du hast (oder willst) die Dir angebotene Hilfe nicht annehmen - DAS ist allerdings eine etwas andere Situation.
Aber: Dein Problem, somit hast Du auch die Macht über den Lösungsweg - musst Den ja nicht mit uns gehen und auch wir können uns durchaus Mal irren, sind ja auch nur Menschen - allerdings ist das Groh der Aktiven hier wohl aus dem Anfänger-Stadium draußen ... sollte ich mich nicht erneut irren :wink:

MfG

Im Allgemeinem wird hier - gerade Anfängern - eigentlich sehr oft geholfen.

Ich finde da kann man ruhig auch mal diskriminieren.

Es gibt 2 Sorten von Neulingen hier:

  • Leute, die was lernen möchten, z.B. ihre eigenen Probleme lösen. Es macht Spaß, diese auch mal über den Hügel zu führen.
  • Und die anderen....

Zu welcher Gruppe ein jeder Neuling gehören möchte, darf er/sie/es sich selber aussuchen.

postmaster-ino:
Hi

Im Allgemeinem wird hier - gerade Anfängern - eigentlich sehr oft geholfen.
Also ist Deine Aussage, daß Dir nicht geholfen wurde, WEIL DU ANFÄNGER BIST, schon Mal nicht so ganz korrekt.

Du hast (oder willst) die Dir angebotene Hilfe nicht annehmen - DAS ist allerdings eine etwas andere Situation.

Danke! Und ja dies Aussage, dass mir nicht geholfen wurde, nehme ich auch zurück.
Mir wurde im ersten Thread diesbezüglich schon ein Hinweis gegeben und ich verstehe es auch, nur ging es mir darum, dass ich Hilfe bei dem Sketch mit Parser brauche.
Ich will hier niemandem ans Bein pinkeln und für den Link zu Robin2 bedanke ich mich. Wenn mein Englisch nicht so miserabel wäre, hätte ich den Parser schon längst fertig...

Mit Parser habe ich schon was geschrieben gehabt..habe es aber leider, weil mein PC faxen gemacht hat, zerschossen und bekomme es nicht hin.

Ebenso erarbeite ich mir täglich alle Grundkenntnisse und bin schon Stolz darauf, dass ich nach einer Woche lesen, einarbeiten und Programm schreiben, schon ein funktionierendes Programm hinbekommen habe. Ich weiß, dass ich noch viel mehr lernen muss und das nicht von heut auf morgen klappen wird. Doch bin voller Tatendrang!
Ich entschuldige mich für diesen miesen Anfang im Forum und hoffe das mir verziehen wird!?

Dann fange ich mal so an:

Was gefällt dir an sscanf() nicht?
Oder auch an strtok()?

Im Prinzip musst du wohl erkennen ob der String den Substring "Fenster" enthält, aber nicht am Anfang. Das wäre sehr einfach:

void setup()
{
  Serial.begin(9600);

  char str1[] = "09.Nov   18:44";
  char str2[] = "Fenster";
  char str3[] = "10/1        Fenster";

  parseString(str1);
  parseString(str2);
  parseString(str3);
}

void loop()
{
}

void parseString(char* str)
{
  char* ptr = strstr(str, "Fenster");
  if (ptr != NULL && ptr != str)   //ptr == NULL -> nicht gefunden; ptr == str -> gefunden, aber steht am Anfang
  {
    ptr = strtok(str, " ");   //Splitten am Leerzeichen. Wir brauchen nur das erste Token
    Serial.println(ptr);
  }
  else
    Serial.println("Zeile enthaelt andere Sachen");
}

Und siehe hier wie man einen String als char Array von der seriellen Schnittstelle liest:
https://forum.arduino.cc/index.php?topic=659446.msg4443056#msg4443056

Vielen Dank für die Hilfe. Es hat mich ein Stück weitergebracht.
Ich habe mir auch alles durchgelesen, was mir über den Link angezeigt wurde.. nur schaffe ich es nicht diese zwei Sketche zu verbinden.
Bezüglich dieses Sketches möchte ich char str3 als Array angeben, damit es als variable funktioniert.
Das Prinzip über den Buffer habe ich verstanden nur klappt es nicht das so zusammenzusetzen das ich variable daten empfangen kann. Denn es kommt ja nicht immer 10/1 raus.. dieses Ergebnis, was gleichzeitig auch die wichtigste Info ist, variiert.
Wie verbinde ich also Parsestring mit Array?

Freundlichen Gruß

Von was für 2 Sketche redest du ?
Ich sehe noch nicht mal einen Sketch von dir.

Wie sollen wir da helfen ?

Es geht um diesen Sketch der vor meinem Post geposted wurde!!

void setup()
{
  Serial.begin(9600);

  char str1[] = "09.Nov   18:44";
  char str2[] = "Fenster";
  char str3[] = "10/1        Fenster";

  parseString(str1);
  parseString(str2);
  parseString(str3);
}

void loop()
{
}

void parseString(char* str)
{
  char* ptr = strstr(str, "Fenster");
  if (ptr != NULL && ptr != str)   //ptr == NULL -> nicht gefunden; ptr == str -> gefunden, aber steht am Anfang
  {
    ptr = strtok(str, " ");   //Splitten am Leerzeichen. Wir brauchen nur das erste Token
    Serial.println(ptr);
  }
  else
    Serial.println("Zeile enthaelt andere Sachen");
}

Und dem SKetch aus dem Link

const unsigned int READ_BUFFER_SIZE = 21;    //Platz für 20 Zeichen + Terminator

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  char* str = readLine(Serial);  //liefert true wenn das LF eingelesen wurde
  if (str != nullptr) 
  {
    Serial.print("Eingelesen: ");
    Serial.println(str);
  }
}

char* readLine(Stream& stream)
{
  static byte index;
  static char buffer[READ_BUFFER_SIZE];

  while (stream.available())
  {
    char c = stream.read();

    if (c == '\n')              //wenn LF eingelesen
    {
      buffer[index] = '\0';     //String terminieren
      index = 0;
      return buffer;            //melden dass String fertig eingelesen wurde
    }
    else if (c >= 32 && index < READ_BUFFER_SIZE - 1)   //solange noch Platz im Puffer ist
    {
      buffer[index++] = c;    //Zeichen abspeichern und Index inkrementieren
    }
  }
  return nullptr;               //noch nicht fertig
}

Und zwar gehe ich davon aus das ich diese zwei Sachen miteinander verbinden muss um eben mein char str3 als variablen Array einlesen zu können!?

Warum sendest du überhaupt son "Mist"

- - - - - - - - - -
017:  09.Nov   18:44
  Fenster
  10/1        Fenster

- - - - - - - - - -

Überleg dir was sinnvolles, wie du die Infos per Schnittstelle austauschst z.B.

"WINDOW:65535"

was für ein uint32_t steht und was man binär auf 16x 1=AUF/0=ZU auswerten kann. Ggf. mit bitRead()
Was du dann wieder für Texte draus machst, ist völlig frei.

Für mich ist das Sinnvoll, weil das genau die Daten sind die ich bekomme und haben will!!!
Ich möchte die Daten nur gern sortieren bzw kürzen, was für mich wichtig ist und was nicht.

Widerspricht jetzt dann aber dem hier

User1809:
Jetzt benötige ich Hilfe, denn ich möchte als empfangene Daten lediglich 10/1 oder 10/1 Fenster angezeigt bekommen.

Noch kürzer wäre "W:" und zwei Byte

Brauchst du datum und zeit dann noch:
"D:YYYYMMDD"
"T:HHMM"

fertig ist der lack. :wink:

User1809:
Wie verbinde ich also Parsestring mit Array?

Indem du etwas Grundlagen über Arrays und char Arrays lernst.

Und den Zusammenhang zwischen Arrays und Zeigern. Arrays zerfallen bei der Übergabe zu Zeigern auf das erste Element. Daher haben Funktionen denen man Arrays übergibt einen Zeiger als Parameter. Und wenn readLine() einen Zeiger zurückgibt zeigt der auf das statische Array "buffer" innerhalb der Funktion

Das demonstriert dir ja auch der Test-Sketch. Die Strings sind dort fest vorgegeben, aber was hindert dich daran statt da einen String von der seriellen Schnittstelle zu übergeben? Das sind beides char Arrays!

Hi

Wenn Er die Daten halt so bekommt - wird das Parsen wohl mit diesem Aufbau funktionieren müssen.

@TO
Auch Satzzeichen sind keine Rudeltiere - die Aussage wäre ebenfalls klar rüber gekommen, wenn Du - ganz banal - einen Punkt gewählt hättest.

MfG

Serenifly:
Indem du etwas Grundlagen über Arrays und char Arrays lernst.

Und den Zusammenhang zwischen Arrays und Zeigern. Arrays zerfallen bei der Übergabe zu Zeigern auf das erste Element. Daher haben Funktionen denen man Arrays übergibt einen Zeiger als Parameter. Und wenn readLine() einen Zeiger zurückgibt zeigt der auf das statische Array "buffer" innerhalb der Funktion

Das demonstriert dir ja auch der Test-Sketch. Die Strings sind dort fest vorgegeben, aber was hindert dich daran statt da einen String von der seriellen Schnittstelle zu übergeben? Das sind beides char Arrays!

Genau das ist mein Problem. Das ich nicht weiß, wie ich das anstelle, da ich Neuling bin und das mein erstes Projekt ist.
UND JA ich muss noch viel lernen und bin fleißig dabei!!