Serielle Daten im Hintergrund Empfangen und im Puffer speichern
hallo,
ich dachte seriell gesendete daten werden im hintergrund empfangen und im pufferspeicher abgelegt.
ich sende auf knopfdruck seriell daten (5byte) mein arduino mega 2560. ich verwende die serial3 schnittstelle. die daten werden einmal in der loop eingelesen. anhand der empfangenen daten wird ein case aufgerufen. einige case sind sehr zeitkritisch da ich sehr viele daten auf led-stripes schreibe. dass ich nicht öfters die serielle schnittstelle auslesen kann oder interrupts verwenden kann.
ich lese die daten mit:
serial3.readbytesuntil(';', data, 5);
nextcase=atoi(data);
ein. leider erfolgt aber in rechenaufwändigen cases keine Änderung. es werden keine neuen daten eingelesen. welche lösung gibt es?
danke marie
ich dachte seriell gesendete daten werden im hintergrund empfangen und im pufferspeicher abgelegt.
ich sende auf knopfdruck seriell daten (5byte) mein arduino mega 2560. ich verwende die serial3 schnittstelle. die daten werden einmal in der loop eingelesen. anhand der empfangenen daten wird ein case aufgerufen. einige case sind sehr zeitkritisch da ich sehr viele daten auf led-stripes schreibe. dass ich nicht öfters die serielle schnittstelle auslesen kann oder interrupts verwenden kann.
ich lese die daten mit:
serial3.readbytesuntil(';', data, 5);
nextcase=atoi(data);
ein. leider erfolgt aber in rechenaufwändigen cases keine Änderung. es werden keine neuen daten eingelesen. welche lösung gibt es?
danke marie
readbytesuntil() ist problematisch
am einfachsten geht es so:
wichtig ist hier, dass du deine zeilen mit einem linefeed abschließt. sonst funktioniert das nicht! man kann auch anderes nehmen, aber lf (oder cr) kann man im serial monitor automatisch einstellen.
dann wird ständig nachgeschaut ob im eingangspuffer ist und die funktion gibt false zurück solange nicht alles da ist. wenn eine zeile da ist, hat man true und schickt die daten durch einen parser.
wenn du mehrere werte hast und diese mit einem strichpunkt trennen willst, schau dir strtok() an. damit kann man dann sowas schicken: "123;456;789" und in drei zahlen wandeln:
am einfachsten geht es so:
code: [select]
const int serial_buffer_size = 10; //bei mehr daten die größe hier anpassen
char serialbuffer[serial_buffer_size];
void loop()
{
if(readserial() == true)
{
//auswertung hier
}
}
bool readserial()
{
static byte index;
while(serial3.available())
{
char c = serial3.read();
if(c >= 32 && index < serial_buffer_size - 1)
{
serialbuffer[index++] = c;
}
else if(c == '\n')
{
serialbuffer[index] = '\0';
index = 0;
return true;
}
}
return false;
}
wichtig ist hier, dass du deine zeilen mit einem linefeed abschließt. sonst funktioniert das nicht! man kann auch anderes nehmen, aber lf (oder cr) kann man im serial monitor automatisch einstellen.
dann wird ständig nachgeschaut ob im eingangspuffer ist und die funktion gibt false zurück solange nicht alles da ist. wenn eine zeile da ist, hat man true und schickt die daten durch einen parser.
wenn du mehrere werte hast und diese mit einem strichpunkt trennen willst, schau dir strtok() an. damit kann man dann sowas schicken: "123;456;789" und in drei zahlen wandeln:
code: [select]
int num1 = atoi(strtok(serialbuffer, ";"));
int num2 = atoi(strtok(null, ";"));
int num3 = atoi(strtok(null, ";"));
Arduino Forum > International > Deutsch (Moderator: uwefed) > Serielle Daten im Hintergrund Empfangen und im Puffer speichern
arduino
Comments
Post a Comment