Eingabe = Serial.read();

Hellow alle zusammen,
Ich will einen Code machen, bei dem ich über den Seriellen Monitor mit dem Arduino Kommunizieren kann. Dazu habe ich diesen Foreneintrag gefunden. Genau dass will ich machen, nur dass ich die Eingabe in einem String speichern will und nicht .txt Dateien auslesen will. Soweit ich weiß, sind Strings ja Arrays aus char Variablen. Deshalb habe ich den Code aus dem anderen Foreneintrag umgeschrieben:

 //code von dem anderen Foreneintrag
if (Serial.available() ) Serial.write(Serial.read());
//Mein Code
String Eingabe = String();

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

void loop() {
  if (Serial.available()) {
    Eingabe = Serial.read();
    Serial.print(Eingabe);
  }
}

Jetzt gibt mein Code aber keine Array bestehend aus char Variablen sondern die besteht aus integer Variablen.
Warum ist dass so, und wie kann ich das mit einer Array die wirklich aus char Variablen besteht machen?
Danke schon mal im Voraus für all die tollen Antworten.
Viele liebe Grüße, Hellow2 :slight_smile:

Du musst zwischen der Klasse String (großes S) und char-Arrays unterscheiden.
String sieht zwar auf den ersten Blick einfacher aus, macht aber auf den Arduinos viele Probleme.
Infos gibt es hier.

Gruß Tommy

Schreib mal, was du überhaupt machen willst.

Tipp a:
Womit alles anfängt...
Lernen, was String ist und auch was ein char Array ist.
Und wie diese funktionieren.

Tipp b:
Eine jede Kommunikation besteht aus einer Sprache/Protokoll, welche von beiden Seiten beherrscht werden muss. Daraus folgt, dass man erst die Sprache definiert und dann Parser und Generatoren entwickelt, welche diese Kommunikation abhandeln.

Natürlich gibt es, in der Arduino Welt, auch schon dieses als vorgekaute Sache ...
z.B. könntest du dir beim CmdMessenger evtl. einiges abschauen.

ElEspanol:
Schreib mal, was du überhaupt machen willst.

Ich will einfach die Eingabe in einer char Array ausgeben.

Tommy56:
Du musst zwischen der Klasse String (großes S) und char-Arrays unterscheiden.
String sieht zwar auf den ersten Blick einfacher aus, macht aber auf den Arduinos viele Probleme.
Infos gibt es hier.

Gruß Tommy

Oke. Und wie lese ich dass dann mir Serial.read(); ein?
Gruß Hellow

Hellow2:
Und wie lese ich dass dann mir Serial.read(); ein?

dafür gibt es gefühlte 1000 Anleitungen im Netz, wovon 1005 Scheisse sind.

Hier im Forum hatten wir schon einige gute serielle Parser (so nennt man den Teil, der die Eingaben verarbeitet) und auch gute Einleseroutinen.

Gib mal Beispiele, wie die Daten aussehen können.

Nur zum Einlesen:

const unsigned int READ_BUFFER_SIZE = 17;    //16 Zeichen + Terminator

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

void loop()
{
  char* txt = readLine(Serial);
  if (txt != nullptr)
  {
    Serial.print("Empfangen: ");
    Serial.println(text);
  }
}

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
}

Das erwartet ein Linfeed am Ende. Du musst das im seriellen Monitor einstellen so dass das automatisch angehängt wird

Was man damit dann macht hängt davon ab was du eigentlich willst. Da musst du trotzdem etwas lernen. z.B. wie man char Arrays mit Text vergleicht (Tip: nicht mit ==). Oder in Integer konvertiert.

Hellow2:
Und wie lese ich dass dann mir Serial.read(); ein?
Gruß Hellow

Indem Du das im angegeben Link liest und verstehst.

Gruß Tommy

Ui danke. Jetzt habe ich es verschanden. :slight_smile:
Viele Liebe Grüße, Hellow2

Noch eine Anmerkung: die serielle Schnittstelle ist im Vergleich zum Prozessor sehr langsam. Selbst mit hohen Baudraten wird i.d.R. nur ein Zeichen pro Funktionsaufruf eingelesen. Du darfst dich da nicht von dem while() verwirren lassen. Deshalb muss man die Funktion ständig aufrufen und abfragen ob sie fertig ist

Mit dem while anstatt if erschlägt man halt den Fall, das der uC vorher z.B. einen Sensor mit blockierender Ausleseroutine abgefragt hat. Dann nimmt das while alle Zeichen aus dem UART Buffer, das if würde nur eines nehmen.

Ja. Außerdem geht das auch mit anderen Quellen als der seriellen Schnittstelle (dank dem Stream Interface). Du kannst mit der gleichen Funktion eine Zeile von einer SD Karte einlesen. Das geht in einem Rutsch