Wo ist das problem?
Der input buffer der seriellen ports sollte eigentlich nur ein kleiner zwischenspeicher sein, so dass kein datenverlust auftritt wenn die daten nicht _sofort_ aus dem datenregister ausgelesen UND verarbeitet werden koennen. Das kopieren erledigt ein interrupt. Er ist nicht dafuer gedacht ein komplettes datenpacket fuer die _bearbeitung_ vorzuhalten.
In der regel ist die verarbeitungsgeschwindigkeit wesentlich hoeher als der eingehende datenstrom. Daher ist es ueberhaupt kein problem daten aus dem seriellen buffer in einen 2ten groesseren buffer zu kopieren. Sobald der dann voll ist kann er bearbeitet werden.
Also:
* daten im seriellen buffer ? --> in den grossen hineinkopieren (array) und index hochzaehlen
* bearbeitungsbuffer voll ? --> auswerten
Es ist auch sinnvol den begin und das ende eines datenpaketes durch geeignete marker erkennbar zu machen.
---
Noch etwas zu SerialEvent()...
Wenn man sich die 'main.cpp' anschaut, dann sieht das so aus:
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
und in 'HardwareSerial.cpp'
void serialEventRun(void)
{
#ifdef serialEvent_implemented
if (Serial.available()) serialEvent();
#endif
#ifdef serialEvent1_implemented
if (Serial1.available()) serialEvent1();
#endif
#ifdef serialEvent2_implemented
if (Serial2.available()) serialEvent2();
#endif
#ifdef serialEvent3_implemented
if (Serial3.available()) serialEvent3();
#endif
}
Durch etwas linker-trickserei ist das so hingebogen, dass es nur ausgefuehrt wird, wenn die funtion auch vom benutzer implementiert worden ist. Sonst wird das wegoptimiert. Interrupts spielen da nicht hinein. Es wird somit erzwungen, dass nach der normalen loop() auch 1x diese funktion aufgerufen wird. Persoenlich finde ich das konstrukt unnoetig.
Das ganze ist 100% aequivalent zu:
void loop(void) {
// irgendwas start
//
// irgendwas ende
if(Serial.available()) {
// mach irgendwas anderes
}
}