RS232 Drucker Schnitstelle

Hallo Zusammen

Ich habe mir vor länger Zeit mal einen Arduino Uno R3 zugelegt ich sollte noch erwähnen, dass ich nicht der jüngste bin mit 59 Jahren aber ich möchte bei meiner Alarm Anlage, die ein Drucker über RS232 Ansteuern kann die Daten empfangen und sie mir auf einem Display anzeigen lassen aber ich verstehe das nicht wie ich die Daten die ankommen, weiter verarbeiten kann ich bekomme die Daten über den seriellen Monitor angezeigt, aber das war es auch schon, da es immer ein Text, der so ist, bis auf die Gruppe sie hat auch Z. B. 2345/54

Alarm
Gruppe 22/7 Einbruch Tür Treppenhaus

Jetzt zu meiner Frage: wie bekomme ich aus dem Text nur die Gruppen und die Zahlen

So sollte den das Ergebnis aussehen

22/7
Tür Treppenhaus

Ich hoffe das ihr mir, da eine kleine Hilfe geben könnt, wie man so was umsetzt, Ich bin für jede Hilfe dankbar

Du wirst einen Parser und/oder Tokenizer bauen dürfen.

Hört sich alles ein wenig komplizierter an, als es ist....
Aber zeigt auch, dass du nicht der Erste mit dem Problem bist.

Natürlich musst du erst die "Sprache" definieren, welche geparst werden soll.

Suchtipp:
sscanf() strtok() und das Drumrum.

Bitte etwas genauer Beschreiben wie der Text aussieht den du bekommst und was du daraus extrahieren willst.

Solche Parser zu schreiben ist ziemlich einfach, aber man muss genau wissen was ankommt.
Fängt der Text den du willst immer mit Alarm an? Steht das alles in einer Zeile oder mehreren?

Hi

Dazu könnte die Anleitung zu der Alarmanlage durchaus hilfreich sein - dort wird drin stehen, was Alles per Drucker ausgegeben wird.
Da Du die Texte schon per Terminal angezeigt bekommst, sollte sich Das machen lassen.

MfG

Hier mal ganz grob dafür dass die Nachricht immer so aussieht:

Zeile 1: "Alarm" [Linefeed]
Zeile 2: "Gruppe" "22/7" "Einbruch" "Tür" "Treppenhaus" [Linefeed]

Das kann sich aber ändern je nachdem wie er Text aussieht. Ich entferne einfach naiv Tokens nach der Anzahl ohne nachzusehen was da drin steht. Das erste Token "Gruppe" wird ignoriert. "Einbruch" ebenso. Die restlichen Tokens werden dann nacheinander ausgegeben.

Kann auch sein dass da mal was anderes kommt oder man es anders haben möchte. Man kann auch wie bei "Alarm" mit strcmp() vergleichen was da tatsächlich steht

Auch die Umschaltung zwischen Zeile 1 und Zeile 2 ist einfach gehalten. Wenn es auch mal einzeilige Meldungen gibt muss man das robuster machen und die Zeilennummer je nach Inhalt ändern.

Nachtrag:
Außerdem ist das ein Test Programm wenn man den Text per Hand im seriellen Monitor eintippt (bzw. rein kopiert). Nicht um von einem anderen Gerät zu lesen und am PC auszugeben. Dafür braucht man zwei Schnittstellen. Aber muss die Schnittstelle von der man liest an readLine() übergeben

const unsigned int READ_BUFFER_SIZE = 51; 
enum States { LINE_1, LINE_2 } state;


void setup()
{
  Serial.begin(9600);
  state = LINE_1;
}

void loop()
{
  char* txt = readLine(Serial);
  if (txt != nullptr)
  {
    parseSerial(txt);

    if (state == LINE_1)
      state = LINE_2;
    else
      state = LINE_1;
  }
}

void parseSerial(char* txt)
{
  if (state == LINE_1)
  {
    if (strcmp(txt, "Alarm") == 0)
      Serial.println(F("Alarm ausgelöst"));
    else
      Serial.println(F("Unbekannte Nachricht"));
  }
  else
  {
    char* token = strtok(txt, " ");   //erstes Token ("Gruppe")
    token = strtok(nullptr, " ");   //zweites Token (Zahlen)
    Serial.println(token);
    token = strtok(nullptr, " ");   //drittes Token ("Einbruch")

    token = strtok(nullptr, " ");   //Rest ausgeben
    while (token != nullptr)  
    {
      Serial.print(token); Serial.print(' ');
      token = strtok(nullptr, " ");
    }
    Serial.println();
  }
}

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
}

Ich habe gelesen, du hast einen Uno. Wenn du da im seriellen Monitor was lesen kannst, hast du entweder softserial, das wäre ok, oder aber du hast die Alarmanlage an Pin 0 und 1 angeschlossen. Das wäre schlecht, da diese Pins für die Kommunikation und Programmierung mit dem PC reserviert sind.

Auch schreibst du, das die Alarmanlage eine rs232 Schnittstelle hat. Das ist ganz was anderes wie das, was der Arduino hat. Das sollte man nicht direkt zusammen klemmen.

Schreib doch mal genauer, was du wirklich an Hardware hast und was für ein Sketch läuft.