Seriellen Eingabebuffer leeren?

Hallo,

in meinem Code habe ich eine while-Schleife, in welcher ich eine Funktion eingebaut habe, damit der Code erst weiterläuft wenn ich eine Eingabe getätigt habe:

while (Serial.available()==0)  {
         }

Wenn die while-Schleife jedoch ein weiteres Mal durchläuft, funktioniert das warten jedoch nicht. Was kann ich dagegen tun? Hier mein Code:

void choose_signal() {
      Serial.println("Welches Signal soll geändert werden?");
      while (Serial.available()==0)  {  // Überprüfung, ob Daten über die serielle Schnittstelle verfügbar sind
      char input[20];  // Array zur Speicherung der Eingabe

      Serial.readStringUntil('\n').toCharArray(input, sizeof(input));  // Lesen der seriellen Daten in den char-Array

      if (strcmp(input, "TC") == 0) {  // Prüfen, ob die Variable 1 geändert werden soll
         Serial.println("Welche Spannung soll angelegt werden?");      //Prompt User for input
         while (Serial.available()==0)  {
         }
         TC = Serial.parseFloat();
         TC = TC * 1000;
         dac.set(3, TC);
         float tol_max = TC*1.1;
         float tol_min = TC*0.9; 
         int read_value = dac.readDAC(3);
         //if ((tol_min < read_value) && (read_value < tol_max)) {
         if (tol_min < read_value <tol_max) {
          Serial.print("TC wurde erfolgreich geändert und beträgt: ");
          TC = TC/1000;
          Serial.print(TC,4);
          Serial.println(" V");      
         } 
         else {
          Serial.println("Es ist ein Fehler aufgetreten");
          delay(5000);
         }

Serial.available()==0 ==> Es gibt nichts zu lesen

Ihr Serial.readStringUntil() könnte eine timeout haben

if (tol_min < read_value < tol_max) {

so funktioniert es nicht. zumindest nicht so wie du erwartest.

void choose_signal() {
  Serial.println("Welches Signal soll geändert werden?");
  while (Serial.available() == 0); // Überprüfung, ob Daten über die serielle Schnittstelle verfügbar sind
  char input[20];  // Array zur Speicherung der Eingabe

  Serial.readStringUntil('\n').toCharArray(input, sizeof(input));  // Lesen der seriellen Daten in den char-Array
  while (Serial.available() > 0)Serial.read();  //das leert Buffer

  if (strcmp(input, "TC") == 0) {  // Prüfen, ob die Variable 1 geändert werden soll
    Serial.println("Welche Spannung soll angelegt werden?");      //Prompt User for input
    while (Serial.available() == 0);
    TC = Serial.parseFloat();
    while (Serial.available() > 0)Serial.read();  //das leert Buffer
    TC = TC * 1000.0;
    dac.set(3, TC);
    float tol_max = TC * 1.1;
    float tol_min = TC * 0.9;
    int read_value = dac.readDAC(3);
    if ((tol_min < read_value) && (read_value < tol_max)) {
    
      Serial.print("TC wurde erfolgreich geändert und beträgt: ");
      TC = TC / 1000.0;
      Serial.print(TC, 4);
      Serial.println(" V");
    }
    else {
      Serial.println("Es ist ein Fehler aufgetreten");
      delay(5000);
    }
  }
}
1 Like

Das was Du suchst ist eine Schrittkette.
Du liest solange von der Seriellen, bis "TC" als Startkennzeichnug kommt.
Nächster Schritt ist dann solange zu lesen, bis ein Steuerzeichen kommt.
Dann wird ausgewertet - danach fängst Du an von vorn.
Da können noch so viele Steuerzeichen und zusätzliche Zeichen kommen wie wollen - der Ablauf und damit auch das Ergebnis ist immer das Gleiche.

Und das auch, wenn die Zeichenfolgen nicht in einem Durchgang kommen.

1 Like

Wenn du sichergehen willst, dass Serial.available() 0 liefert, bis danach wieder eine neue Eingabe kommt, musst du warten, bis die vorige Eingabe komplett angekommen ist und sie dann komplett lesen (und gegebenenfalls alles uninteressante nachkommende ignorieren).

Ja ich weiß. Ich habe es nur so gemacht (und die richtige Variante als Kommentar) um testen zu können, wenn es wahr wäre, da ich den DAC noch nicht hier habe

Vielen Dank, das klappt!

Dann möchte ich Dir mal eine Kurzversion vorstellen.

Den code einfach mal aufspielen und im SerMon TC oder TF gefolgt von einem Wert oder irgendwas anderes eingeben und staunen.

void setup()
{
  Serial.begin(115200);
  Serial.println(F("\r\nStart...\r\n"));
}

void  loop()
{ choose_signal(); }
//
void auswertung(char *buffer)
{
  switch (buffer[0])
  {
    case 'T':
      switch (buffer[1])
      {
        case 'C':
          Serial.print(F("TC: "));
          Serial.println(&buffer[2]);
          break;
        case 'F':
          Serial.print(F("TF: "));
          Serial.println(&buffer[2]);
          break;
      }
      break;
    default:
      Serial.print(F("Nicht unterstützt: "));
      Serial.println(buffer);
  }
}
//
void choose_signal()
{
  const byte bufSize = 20;
  static byte idx = 0;
  static char buf[bufSize] = {'\0'};
  if (Serial.available())
  {
    char inChar = Serial.read();
    if (isGraph(inChar) &&
        idx < bufSize - 1)
    {
      buf[idx] = inChar;
      idx++;
    }
    else
    {
      if (idx > 0)
      { auswertung(buf); }
      memset(buf, '\0', bufSize);
      idx = 0;
    }
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.