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