Projektbegleitende Anfängerhilfe gesucht: 1. Akt: Steuerzeichen auslesen

Hallo Forum,

für ein Studienprojekt benötige ich ein paar Informationen bezüglich der Verarbeitung von Strings und der Seriellen Schnittstelle. Das ganze ist etwas problematisch, weil ich nie zuvor mit dem Arduino spielen konnte. Nach den ersten 2 oder 3 Lernbeispielen von dieser Seite habe ich das System (hoffentlich) soweit verstanden, dass ich mich an meinen eigenen Algorithmus gemacht habe, den ihr unten seht. Soweit ich das sehe, lese ich im Moment den Puffer leer, egal ob es ins char-Array passt oder nicht. Das ist noch nicht weiter schlimm, wird aber später interessant (siehe den betreffenden Kommentar im Programm). Im folgenden wird, sollte etwas im Array stehen, dessen Inhalt in ein String-Objekt gewandelt, damit ich die Stringfunktionen darauf anwenden kann. Dies wird zu einem späteren Zeitpunkt sehr wichtig sein.
Der ankommende String wird von einem anderen µController kommen und ist nicht beeinflussbar. Derzeit suche ich noch Testweise nach Zeichen, die ich vom PC abschicke, im Code unten also nach ‘*’, was auch funktioniert.
Genug blabla, da akute Problem:

  1. Wonach muss ich suchen, wenn ich Steuerzeichen lesen will? Überleben die überhaupt das Schreiben in ein Char-Array und die nachfolgenden Umwandlungen? Wenn nicht, wie kann ich sie erhalten? Die Frage ist generell interessant. Für das Projekt ist nur wichtig, bei einem abschließenden CR und/oder LF das Lesen ins Array zu beenden.
  2. Viel banaler - Was muss ich senden, wenn ich Steuerzeichen übermitteln will? Ich tippe ja Klartext. Wenn ich da \n oder \r reinschreibe, wird das ja auch so übermittelt. Eine Frage mit der ich mich noch nie ernshaft beschäftigen musste. Jetzt wird das wichtig.

Im folgendenden der aktuelle Quelltext:

void setup(){
  Serial.begin(9600);                                  // Öffnen der Seriellen Verbindung, Baudrate 9600
}

void loop(){
char ant_meldung_char[25];

// ***************************************************
// Hier wird der serielle Port ausgelesen.
// Arraygröße kann auf die maximale Nachrichtenlänge
// beschränkt werden
// ***************************************************
  int i = 0;                                            // Laufvariable für das Array, lokal durch Initialisierung innerhalb der Funktion
  while (Serial.available() >0)                         // Liest alle am Seriellen Port anstehenden Zeichen in die Variable ant_meldung
  {                                                 // Muss bei Linefeed ('\n') abbrechen! Entsprechend umbauen! Evtl. Fkt Serial.peek() nutzen.
    ant_meldung_char[i]=Serial.read();  
    i++;
    delay(3);                                           // Delay puffert mögliche Verzögerungen.
  }

  if (ant_meldung_char[0] != 0)                         // nur wenn etwas im Array steht
  {
    String ant_meldung = String(ant_meldung_char);      // Umwandlung des string arrays in ein Stringobjekt, damit die zugehörigen Funktionen genutzt werden können
    int index_start = ant_meldung.indexOf("*");             // Abfrage auf Nachrichten Startzeichen
    Serial.println(index_start);                        //Ausgaberoutine zu testzwecken am PC. Zur Kommunikation mit dem Antrieb auskommentieren!
    Serial.println(ant_meldung);                           //Ausgaberoutine zu Testzwecken am PC. Zur Kommunikation mit dem Antrieb auskommentieren! 
    for (int b = 0; b <= i; b++)                        // ==>reset des Arrays durch Schreiben in alle Stellen bis einschließlich i
    {
      ant_meldung_char[b] = 0;
    }
  }
}

Ich hoffe auf tatkräftige Unterstützung für einen ambitionierten Neuling und bedanke mich im Voraus
Broti / Jan

Hi, willkommen...!!!

Erstmal viel Erfolg... ich bin nichtExperte genug um wirklich richtige Aussagen zu treffen also behandele mein Halbwissen mit vorsicht.

Zu 1 und eigentlich auch zu 2.:

Du fragst inwiefern Zeichen in einem Char-Array erhalten bleiben....

dazu mußt Du wissen das ein Char nichts anderes ist als die Umschreibung eines Zeichens und zwar mittels ASCIIcode...

Such Dir eine ASCII Tabelle, dann siehst du theoretisch die Codes zu den entsprechenden Zeichen, die SO in dem Char array gespeicjhert werden können.

Zunächst also der Standard Zeichensatz + ein paar Steuerzeichen ... 0-255.

\r \n ist eine Notierung welche einen Zeilenumbruch hervorruft wenn sie vom Ziel richtig interpretiert wird... Die Notierung könntest Du natürlich in ASCII Codes wandeln.. bzw. in ein Char Arry schreiben....

Jetzt wäre die Frage ob Du an den Computer oder an den MC schicken willst....

Für die Ausgabe im Terminal hast du ja print(ln) um einen um einen Linefeed auszuführen.

Ein anderer MC müßte wenn ich es richtig sehe entweder erstmal lernen /r /n zu interpretieren, oder aber ein vorher definiertes Steuerzeichen als ersatz bekommen.

Wie gesagt bin mir nicht zu sicher, aber esse gerade Ravioli und dachte mal auf deine Frage zu antworten ;)

Lieber Gruß Chris

Soweit ich das sehe, lese ich im Moment den Puffer leer, egal ob es ins char-Array passt oder nicht. Das ist noch nicht weiter schlimm, wird aber später interessant (siehe den betreffenden Kommentar im Programm).

Du kannst mehr Elemente in ein Array schreiben als dies dessen defienierte Größe es zulassen würde; NUR: das ist absolut zu vermeiden, da Du dadurch die nachfolgenden Speicherstellen überschreibst und so andere Variable überschreibst. Da führt zu unvorhersagbaren Fehlfunktionen des Programms. Viele Grüße Uwe

Also meiner Meinung nach wird auch bei der seriellen Übertragung Ascii-Code gesendet - deshalb denke ich das in \r\n als x0A x0D bzw eben d10 d16 ankommen müsste. beim senden klappt ein \r\n - hab ich auf dem PC zumindest als CRLF bekommen.

[quote author=Marcus W link=topic=79113.msg597917#msg597917 date=1321408620] Also meiner Meinung nach wird auch bei der seriellen Übertragung Ascii-Code gesendet - deshalb denke ich das in \r\n als x0A x0D bzw eben d10 d16 ankommen müsste. beim senden klappt ein \r\n - hab ich auf dem PC zumindest als CRLF bekommen. [/quote] Es kommt darauf an ob das Programm auf dem PC diese Steuerzeichen verschickt. Grüße Uwe

Hallo, wenn ich als normalen Textstring \r\n rausgebe, wird mit dem mitgelieferten Serialmonitor das auch als Klartext \r\n ausgegeben. Das werde ich aber mal mit HTerm überprüfen.

Den Arrayüberlauf werde ich vermeiden, sobald die Abfrage auf Steuerzeichen implementiert ist. Das hat aber an dieser Stelle noch keine Priorität, ist aber gut zu wissen. Irgendwo hatte ich das auch schon gelesen, habe es aber wohl wieder verdrängt.

//Edit: mit HTerm sehe ich, dass der Arduino die Steuerzeichen automatisch anhängt. Außerdem funktioniert es nach den HexCodes zu suchen. Damit werde ich als nächstes versuchen über die peek-Funktion das Lesen zu beenden.

LG Jan