Ich versuche, bis zu 64 Zeilen von maximal 16 Zeichen auf einem LCD-Bildschirm über serielle angezeigt werden. Diese Zeilen müssen beim Start angegeben werden. Ich habe die folgende bekam, die in den meisten Fällen funktioniert:Lesen mehrerer Zeilen von der seriellen
unsigned char textMatrix[64][17];
unsigned char lineCount = 0;
void readLines(){
Serial.println("Send up to 64 lines of up to 16 characters. Send an empty line to stop sending lines. Make sure to use \\n (newline) as line terminator!");
Serial.setTimeout(10000);
bool receiving = true;
while (receiving){
if(Serial.available() > 0) {
textMatrix[lineCount][0] = '\0';
char res = Serial.readBytesUntil('\n',textMatrix[lineCount],16);
if (res == 0){
if (textMatrix[lineCount][0] != '\0'){
continue;
}
Serial.println("Received empty line");
receiving = false;
break;
}
textMatrix[lineCount][16] = '\0';
Serial.print("Received line: ");
Serial.println((const char*)textMatrix[lineCount]);
lineCount++;
if (lineCount >= 63){
receiving = false;
}
}
}
}
Das Problem tritt auf, wenn ich die folgende Zeile an:
Okay, das ist ein
Diese Linie ist genau 16 Zeichen lang. Ich nehme an, dass dies dazu führt, dass readBytesUntil
zweimal ausgelöst wird, was dazu führt, dass es dasselbe ist, als würde man zweimal Enter drücken. Es scheint mir nicht möglich zu sein, einen Unterschied zwischen dem Senden einer leeren Zeile oder dem Senden einer Zeile mit genau 16 Zeichen zu finden. Was wäre der beste Weg, dies zu lösen?