Serielle Ausgabe kein oder eigenartiger Output

Hallo,

ich habe angefangen mich mit dem Arduino auseinander zusetzen.
Ich möchte später gerne die Serielle Eingabe nutzen für ein Projekt, deshalb will ich jetzt etwas testen um ein besseres Verständnis zu bekommen.
Und zwar wollte ich eigentlich nur wissen, ob es möglich ist bei einem Serial.available() die Anzahl der 'wartenden' Buchstaben abzufragen.
Dazu habe ich folgenden simplen Code geschrieben, welcher aber nichts verwertbares in der Ausgabe liefert.

 void setup() {                
  Serial.begin(9600);
  
}
void loop(){
  if (Serial.available() > 0)
  {
    
    while(Serial.available() > 0)
    {
      Serial.println("Anzahl von available:  " + Serial.available());  
      delay(10);    
      Serial.println("Hier der eingelesene Buchstabe:  " + Serial.read());
      delay(10);
      Serial.println("------------");
      delay(10);
    } 
  }
  delay (2000);
}

Was habe ich falsch gemacht? Bzw. was muss ich für eine brauchbare Ausgabe machen?

Arduino UNO, UBUNTU 10.04, IDE 0022

Vielen Dank!

Serial.available() gibt nur die Presenz von Daten in der Eingangswarteschleife bekannt, nicht die Anzahl.
Du mußt die Daten schon mit Serial.read lesen und kannst dadurch erkennen wieviele Zeichen angekommen sind.
Grüße Uwe

Du solltest bei der seriellen Ausgabe nicht die Datentypen vermischen:

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

void loop() {
  if (Serial.available() > 0)
  {

    while(Serial.available() > 0)
    {
      Serial.print("Anzahl von available:  ");
        Serial.println(Serial.available());
      delay(10);
      Serial.print("Hier der eingelesene Buchstabe:  ");
        Serial.println(Serial.read());
      delay(10);
      Serial.println("------------");
      delay(10);
    }
  }
  delay (2000);
}

Danke erst mal!

Damit hat uwefed ja schon eine meiner Fragen beantwortet.
@ sth77 Danke für den Tipp, aber wird nicht automatisch ein Cast von der Serial.print() ausgeführt?

EDIT: Scheinbar nicht :wink: mein Fehler.

Das Problem vor dem ich nun stehe ist, dass ich noch nicht weiß wie ich im Arduino ein Codewort zusammensetzen soll. Ich hätte es jetzt über ein Array gelöst(Das hätte aber nur geklappt, wenn ich die Anzahl der wartenden Buchstaben gewusst hätte, um ein passendes Array zu deklarieren). Hat jemand eine Idee dafür?
Danke!

Hallo, ich muss alles gesagte revidieren.

Nachdem ich den Code von sth77 vollständig übernommen habe, habe ich gemerkt, dass es i.G. doch so möglich ist, wie ich es wollte.
Es ist also möglich die Anzahl der wartenden Buchstaben zu bekommen über Serial.available. Der Fehler war nur, dass es kein Cast bei der Ausgabe gibt.
Mal sehen, wie es am klügsten ist mein Codewort zusammenzusetzen.

Eine Frage noch: Die Buchstaben werden ja als Zahlencode ausgegeben. Sind sie intern im Arduino auch als Zahlen oder als Buchstaben?
Alo kann ich ein if(codewort == "geheim") {} machen oder muss ich "geheim" erst umwandeln?
Ist es eigentlich ASCII-Code?

Damit erhältst du auch "schönere" Ergebnisse:

char Incoming;
String Gesamt = "";

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

}
void loop(){
  if (Serial.available() > 0)
  {

    while(Serial.available() > 0)
    {
      Serial.print("Anzahl von available:  ");
        Serial.println(Serial.available());
      delay(10);
      Incoming=Serial.read();
        Gesamt=Gesamt+Incoming;
        Serial.print("Hier der eingelesene Buchstabe:  ");
        Serial.println(Incoming);
      delay(10);
      Serial.println("------------");
      delay(10);
    }
    Serial.println(Gesamt);
    Serial.println("------------");
  }
  delay (2000);
  Gesamt = "";
}

edit: Neue Gesamtausgabe hinzugefügt...

Hi, danke für deine Vorschläge!
Echt super.

Ich wollte mir die andere Frage eigentlich selbst beantworten. Kannst Du mir sagen, weshalb ich bei folgendem Code nur jeden zweiten Buchstaben zu sehen bekomme?

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

}
void loop(){
  if (Serial.available() > 0)
  {

    while(Serial.available() > 0)
    {
      Serial.print("Anzahl von available:  ");
        Serial.println(Serial.available());
      delay(10);
      Serial.print("Hier der eingelesene Buchstabe:  ");
        Serial.println(Serial.read(),BYTE);
      delay(10);
        if(Serial.read() == 'a')
        {
          Serial.println("Hurra!");
          delay(10);
        }
      Serial.println("------------");
      delay(10);
    }
  }
  delay (2000);
}

Danke!

Weil du mit jedem Serial.read ein Byte aus dem Eingangspuffer ausliest.
Du liest aber immer gleich zwei aus...

Also mach es so wie in meinem editierten Beispiel und speichere das Zeichen einmal in einer Variable, um es dann zu überprüfen.

Natürlich. Logisch, wie doof von mir.

habe jetzt auch probiert und es klappt alles genau so wie ich es brauche

 char Incoming;
String Gesamt = "";

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

}
void loop(){
  if (Serial.available() > 0)
  {

    while(Serial.available() > 0)
    {
      Serial.print("Anzahl von available:  ");
        Serial.println(Serial.available());
      delay(10);
      Incoming=Serial.read();
        Gesamt=Gesamt+Incoming;
        Serial.print("Hier der eingelesene Buchstabe:  ");
        Serial.println(Incoming);
      delay(10);
      Serial.println("------------");
      delay(10);
    }
    Serial.println(Gesamt);
    Serial.println("------------");
  }
  if (Gesamt == "geheim")
  {
   Serial.println("Codewort ist richtig!"); 
  }
  delay (2000);
  Gesamt = "";
}

1000 Dank sth77 Du hast mir echt sehr geholfen!