Zahl über 9 mit der Seriellen Schnittstelle auslesen

Hi,
ich habe ein kleines Problem. Ich möchte mit meinem Bluetooth Gerät (HC-05) an meinen Arduino Zahlen schicken, da es jedoch meherere sind benötige ich mehr als 9. Jedoch wenn ich zum Beispiel eine ''11" eingeb, erkennt der Arduino dies als zwei mal 1. Wie kann ich also hohe Nummern auslesen.

Dies ist mal der Code

if(Serial.available()) //wenn Daten empfangen werden...      
{
  int data = Serial.read();//..sollen diese ausgelesen werden
  
  if (data=='1') //wenn das Bluetooth Modul eine „1“ empfängt..
  {
   Mojito();
  }
  else if (data == '20') //wenn das Bluetooth Modul „20“ empfängt...
  {           
   TequilaSunrise();
  }
}

(dies ist für ein Projekt für eine Vollautomatischen Cocktailmaschiene, welcher eben auch per Handy gesteuert werden soll)

PS:wenn ich den ganzen Code sehen wollt einfach sagen, sind jedoch 1300 zeilen

Grüße Jonah

“20” ist was ganz anderes als ‘20’

Bei sowas musst du Zeichen für Zeichen einlesen. Und das bis zu einem Endzeichen. Normal nimmt man da das Linefeed (LF). Das kannst du im seriellen Monitor auch direkt einstellen

Eine sehr einfache Version für positive Zahlen ist es die Zahl einfach aufzuaddieren. Aktuelle Zahl * 10 + neue Ziffer. Und das bis zum Endzeichen

Es gibt auch die Arduino Komfort-Funktion parseInt(), aber die ist blockierend und nicht so flexibel. Wenn es aber wirklich nur Zahlen sind und man mit setTimeOut() eine vernünftige Timeout Zeit (statt die Standard 1 Sekunde) einstellt kann das auch akzeptabel sein

Hier eine Variante mit Strings. Damit kann man auch komplexere Übertragungen mit Text oder Buchstaben machen:

const int SERIAL_BUFFER_SIZE = 5;    //Platz für 4 Ziffern + Terminator

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

void loop()
{
  char* str = readSerial(Serial);
  if (str != NULL)      //liefert true wenn das LF eingelesen wurde
  {
    Serial.print("String: "); Serial.println(str);

    int number = atoi(str);
    if (number == 20)
      Serial.println("20 empfangen");

    Serial.println();
  }
}

char* readSerial(Stream& stream)
{
  static byte index;
  static char serialBuffer[SERIAL_BUFFER_SIZE];

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

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

Dabei beachten dass du char Arrays nicht mit == vergleichen kannst!

Und readSerial() muss immer wieder in loop() aufgerufen werden da die serielle Übertragung sehr langsam ist. Also nicht denken dass das einmal aufgerufen wird und gleich fertig ist. Im Idealfall ist der Rest des Codes größtenteils nicht-blockierend. Dann kann man andere Dinge tun während die Übertragung läuft

Hallo,

Beispiel / 04 communication / readASCIIString

Du must mehr als ein Zeichen einlesen solange bis ein endzeichen kommt. Kommt ein endzeichen ?

Heinz

Hallo Heinz, ich glaube ich stehe gerade auf''m schlauch. Was ist noch mal ein Endzeichen?

Gruß Jonah

Das hatte Dir Serenifly schon geschrieben.

Gruß Tommy

Hallo,

z.B das letzte zeichen das kommt , immer gleich ist, und nicht zu den Nutzdaten gehört.

bei der Eingabe über den Monitor is das die Enter Taste der Zeichencode und die Abfrage dazu

char zeichen = char (Serial.read());

if (zeichen == ‘\n’) { // ende erkannt

Hallo,
ich würde jetzt gerne die parseInt() funktion verwenden,
wie schreibe ich dann das mit in verknüpfung mit Serial.read()?

Gruß Jonah

Gar nicht:
https://www.arduino.cc/reference/en/language/functions/communication/serial/parseint/

Und unbedingt das beachten:
https://www.arduino.cc/reference/en/language/functions/communication/serial/settimeout/

also es hat jetzt mit parseInt() funktioniert

   if(Serial.available()){
 unsigned long data;
 data = Serial.parseInt();//..sollen diese ausgelesen werden
  
  if (data== 1){
   TequilaSunrise();
  }
  else if (data == 2){           
   Margarita();
  }
  else if (data == 3){           
   Mojito();
  }
  else if (data == 4){           
   BarkardiCola();
  }
  else if (data == 5){           
   Screwdriver();
  }
  else if (data == 6){           
   CubaLibre();
  }
  else if (data == 7){           
   Screwdriver_Wodka();
  }
  else if (data == 8){           
   Revolution();
  }
  else if (data == 9){           
   Tequila_shot();
  }
  else if (data == 10){           
   Wodka_shot();
  }
  else if (data == 11){           
   Rum_shot();
  }
  else if (data > 50 && data < 2000){
    Tequila_ml = data;
  }
  
  
  Serial.println(data);
}