Problem Serieller Monitor Ausgabe

Hey zusammen,
ich hab folgendes Problem:
Ich will Benutzer und zugehörige Passwörter im EEPROM des UNO speichern.
Bei der Abfrage im Seriellen Monitor wartet er zwar auf die Abfrage welcher Nutzer geändert werden soll Aber nicht wie der neue Nutzer heißt.

Könnte es daran liegen das dass zweite Serial.available noch wahr ist da irgendwelche “Reste” in der Seriellen Ausgabe sind wie ein Enter?

Ich hab mal alles an Code angeheftet das momentane Problem liegt aber im Loop

Sichtbar wird das Problem am besten wenn Ihr das Programm mal hochladet. Und eine Zahl eintippt eigentlich sollte der Monitor dann bei der Abfrage des neuen Namens stehen bleiben und nicht die Loop von vorne beginnen.

Das Passwort soll eine Zahl zwischen 0 und 999999 sein. Deswegen einmal die Abfrage des String und des long.

#include <EEPROM.h>

#define UserCount 5
String tabUser[UserCount];
long tabCode[UserCount];



void setup()
{
  Serial.begin(9600);
  // Read Data from EEPROM
  for (int i = 0; i < UserCount; i++)
  {
    tabUser[i] = readStringFromEEPROM(i * 14);

    if (i == 0)
    {
      tabCode[i] = eepromReadLong(9);
    }
    else
    {
      tabCode[i] = eepromReadLong(i * 9);
    }

  }
  affichenom();
}

void loop() 
{
  affichenom();
  int iUser;
  Serial.println("Which user do you want to change the name of?");
  while (!Serial.available());
  iUser = Serial.parseInt();


  Serial.println("Please enter the new user name:");
  while (!Serial.available());
  String newname = Serial.readString();
  writeStringToEEPROM(iUser * 14, newname);
  tabUser[iUser] = newname;
  Serial.println("The new entry name is:");
  Serial.println(newname);

}
void changename()
{
  affichenom();

  Serial.println("Which user do you want to change the name of?");
  while (!Serial.available())
  {
    delay(100);
  }
  int iUser = Serial.parseInt();


  Serial.println("Please enter the new user name:");

  while (!Serial.available())
  {
    delay(100);
  }
  String newname = Serial.readStringUntil(1);
  writeStringToEEPROM(iUser * 14, newname);
  tabUser[iUser] = newname;
  Serial.println("The new entry name is:");
  Serial.println(newname);

}

void changecode()
{
  affichenom();
  Serial.println("Which user do you want to change the code for?");
  while (!Serial.available());
  int iCode = Serial.parseInt();

  Serial.println("Please enter the new user code:");
  while (!Serial.available());
  long newcode = Serial.parseInt();
  if (iCode == 0)
  {
    eepromWriteLong(newcode, 10);
  }
  else
  {
    eepromWriteLong(newcode, iCode * 10);
  }
  Serial.println("Your code has been changed. Thank you.");

}

void affichenom()
{

  Serial.println("The names of the users are:");

  for (int i = 0; i < UserCount; i++)
  {
    Serial.print(i);
    Serial.print("- ");
    Serial.print(tabUser[i]);
    Serial.println("");
  }
}


void writeStringToEEPROM(int addrOffset, const String & strToWrite)
{
  byte len = strToWrite.length();
  EEPROM.write(addrOffset, len);
  for (int i = 0; i < len; i++)
  {
    EEPROM.write(addrOffset + 1 + i, strToWrite[i]);
  }
}

String readStringFromEEPROM(int addrOffset)
{
  int newStrLen = EEPROM.read(addrOffset);
  char data[newStrLen + 1];
  for (int i = 0; i < newStrLen; i++)
  {
    data[i] = EEPROM.read(addrOffset + 1 + i);
  }
  data[newStrLen] = '\ 0'; // !!! NOTE !!! Remove the space between the slash "/" and "0" (I've added a space because otherwise there is a display bug)
  return String(data);
}

void eepromWriteLong(long lo, int adr) {
  byte by;

  for (int i = 0; i < 4; i++) {
    by = (lo >> ((3 - i) * 8)) & 0x000000ff;
    EEPROM.write(adr + i, by);
  }
} // eepromWriteLong


long eepromReadLong(int adr) {
  long lo = 0;

  for (int i = 0; i < 3; i++) {
    lo += EEPROM.read(adr + i);
    lo = lo << 8;
  }
  lo += EEPROM.read(adr + 3);
  return lo;
} // eepromReadLong

Haben Sie diesen Kommentar gesehen?

Nein tatsächlich nicht super Hinweis :sweat_smile:

Allerdings ist diese Funktion ja nicht Teil des Problems. Sondern es könnte nur beim Auslesen der Daten aus dem Eeprom zu Fehler kommen.
Richtig?

neu:

 while(Serial.available()); // leert den seriellen Puffer
 Serial.println("Which user do you want to change the name of?");
 while (!Serial.available()); // Wartet auf etwas
  iUser = Serial.parseInt(); // übernimmt es
 
 while(Serial.available()); // leert den seriellen Puffer
  Serial.println("Please enter the new user name:");
  while (!Serial.available()); // wartet
  String newname = Serial.readString(); // übernimmt

An so etwas in der Art hatte ich auch schon Gedacht aber das Programm kommt aus

while(Serial.available())Serial.print("."); // leert den seriellen Puffer
  Serial.println("Please enter the new user name:");

nicht mehr raus es kommen durchgehend Punkte im Seriellen Monitor.
Gibt es noch eine Andere Möglichkeit den Seriellen Puffer zu löschen?

Da hast Du ein Problem.
Ich würde mir in HEX anzeigen lassen, was da kommt.
Darauf kannst Du reagieren, indem Du genau das, was da kommt ignorierst.
AAABER: Das geht dann nicht mehr so ganz einfach.
Daher!: Ursache suchen und beheben.
Wenn Du das selbst nicht hinbekommst, dann frage; mit DEINEM Ansatz, das man darauf aufbauen kann.

lies einfach deine Serielle aus bevor du eine neue Usereingabe zulässt.
also vorher ein while Serial available ... Serial.Read und dann erst die Frage stellen und wieder die Serielle abfragen.

Moin Moin,

das macht er ja jetzt.
Mein Code aus #4 hat er in #5 mit ner Ausgabe versehen, weil er nicht mehr zur Eingabemöglichkeit gekommen ist.
Nur lässt er sich da nen '.' ausgeben und nicht den HEX-Wert von dem was da reinfummelt.

also sowas leert meines erachtens keinen Puffer:

das wartet bis der Puffer leer wäre. geleert wird da nix.

Ja...
Da fehlt ne Zeile :frowning: Ach menno...

@TO:

 while(Serial.available())
 Serial.read;  // leert den seriellen Puffer

Hab es jetzt schon zum laufen bekommen es war immer noch ein Linefeed im Puffer mit folgenden Code klappt es wie gewünscht das was Ihr Besprochen habt habe ich jetzt noch nicht getestet

  while (Serial.available()); //Delete Serial Data
  Serial.println("Which user do you want to change the name of?");
  while (!Serial.available()); //Wait for Serial Data
  int iUser = Serial.parseInt(); //Save Data

  Serial.println("Please enter the new user name:");
  while (!Serial.available());  //Wait for Serial Data
  if (Serial.read() == 0x0A)while (!Serial.available()); //If the Serial Data is a Linefeed ignore

  String newname = Serial.readString(); //Save Data
  newname = newname.substring(0, newname.length() - 1); //Delete last Digit because it is a Linefeed
  writeStringToEEPROM(iUser * 14, newname);
  tabUser[iUser] = newname;

  Serial.println("The new entry name is:");
  Serial.println(newname);