Mycket bra läsning!
Det är ganska enkelt och MCUn behöver inte arbeta varje byte som ska sändas utan bara ett block i taget, detta gör att jag tjänar in massa exekveringstid som annars skulle gå till att "administrera" sändningen.
Först och främst vill jag påpeka att detta körs på en Cortex-M3 processor i 100MHz så under de 16 byte (FIFOn va på 16 byte, kom ihåg fel) som skickas (i 115200 baud) så hinner den med ca 140k instruktioner så det blir massor av tid till övers för det om är viktigt innan man behöver ta hand om interrupten igen.
Detta använder jag främst för att mosa ut massa sensordata och filterdata på KFly medan det flyger för att lättare hitta problem i filterkod och reglerkod.
Då för varje avläsning av sensorerna skickar jag 40 byte (inkl. checksum, kommandon och timestamp) och detta görs 200ggr/s.
Så det blir att ca 70% av min bandbredd går till detta, så det sparkar på ganska bra!
Jag funderade ofta på om buffern skulle bli full, men under config samt telemetridata så brukar toppen ligga på ca 100byte.
Så maxet på 256 byte används inte, men det är bra att ha extra utifall att något händer.
Jag har lite enkel error-hantering som säger till om strängen man försöker skicka inte kommer få plats i buffern, men den har aldrig än behövts.
Jag gör liknande när jag tar emot data. RX har också en FIFO på 16 byte, men den kräver lite mer "administration".
En interrupt går av när det finns 14 bytes i buffern, då laddas det av till en "kommando tolk" (en buffer egentligen) som väntar på att hela kommandot ska komma.
Problemet är om man skickar och FIFOn bara får säg 7 bytes i sig. Då kommer ingen interrupt.
Där försöker jag hitta en bra lösning, men just nu har jag en funktion som kollar var 20e ms om buffern är tom och om den inte är tom så laddar den ur de få bytes som finns till kommando tolken.
Detta är inte direkt optimalt, men det finns ingen hårdvaru time out som man kan sätta, så det blir lite extra jobb.
Ni kanske har något bra tipps på hur man kan lösa detta?