Guten Tag,
ich versuche einen String einzulesen und wieder auszugeben. Das funktioniert auch bedingt. Aber: Sobald der String zu lang wird, erhalte ich eine Zeilenumbruch, was mit dem Delay zusammenhängt. Wie kann ich vernünftig einen String einlesen und diesen im Anschluss ausgeben? Bin recht neu in der Arduinowelt unterwegs.
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
String string = "";
char letter = 0;
int wait = 0;
void loop() {
// put your main code here, to run repeatedly:
if (Serial.available() > 0) {
wait = 0;
letter = Serial.read();
if (letter != '\n') {
// a character of the string was received
string += letter;
}
else {
// end of string
}
} else {
delay(100);
if(string != ""){
Serial.println(string);
string = "";
}
}
}
Du versuchst doch schon auf ein LF abzufragen. Was machst du dann noch mit dem Delay? Einfach so lange alles einlesen bis das LF kommt und dann erst ausgeben.
const int SERIAL_BUFFER_SIZE = 20;
char serialBuffer[SERIAL_BUFFER_SIZE];
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (readSerial(Serial)) //liefert true wenn das LF eingelesen wurde
{
Serial.println(serialBuffer);
}
}
bool readSerial(Stream& stream)
{
static byte index;
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 true; //melden dass String fertig eingelesen wurde
}
else if (index < SERIAL_BUFFER_SIZE - 1) //solange noch Platz im Puffer ist
{
serialBuffer[index++] = c; //Zeichen abspeichern und Index inkrementieren
}
}
return false; //noch nicht fertig
}
Das verwendet klassische C Strings statt der Arduino String Klasse. Wenn du die weiter verarbeiten willst gibt es eine ganze Reihe Funktionen dafür. z.B. strcmp() zum Vergleich, strstr() um Teil-Strings zu suchen, strncmp() um eine Anzahl von Zeichen am Anfang zu vergleichen, strtok() um Strings zu splitten, oder atoi() für die Konvertierung von Zahlen nach int