Hvordan tømme Arduino seriebuffer

Hvordan tømme Arduino seriebuffer

Arduino er en elektronisk plattform som tar instruksjoner fra brukere i form av kode kjent som skisse og genererer utgang deretter. For å samle instruksjonene og behandle dem en etter en, bruker Arduino en seriell buffer. Arduino -seriebufferen har innkommende data til enheten er klar til å behandle dem. Noen ganger må vi tømme Arduino -seriebufferen for å unngå forstyrrelse av innkommende data. La oss se dette mer detaljert.

Arduino seriell buffer

Så vi vet alle at Arduino kommuniserer ved hjelp av seriell kommunikasjonsprotokoll kjent som USASart. Ja, Arduino har noen andre protokoller som SPI, I2C, men Usart er den vanligste og ofte brukte protokollen. Hvis du har interesse for å lese Arduino alle tre protokollene, klikk her.

Arduino serielle buffere samler inn innkommende serielle tegn og holder dem til mikrokontrolleren kan behandle dem. Seriell kommunikasjon er metoden for å overføre data fra en enhet til en annen. Arduino ved hjelp av Usart -maskinvare på brettene samler hver 8 biter i en byte. Oppbevares deretter disse byte i seriebufferen, maksimalt 64 byte kan lagres inne i Arduino -seriebufferen.

Klar Arduino seriell buffer

Arduino serielle buffere har begrenset minne for å lagre data I tilfelle hvis minnet strømmer over eller store datamengder er der på seriell pin, må vi først tømme seriebufferen for å lagre innkommende data. La oss finne ut mulige måter å rydde Arduino -seriebufferen.

Måter å tømme Arduino seriell buffer

For å frigjøre seriell bufferområde slik at den kan oppdateres med nye data som følger av de to måtene kan være nyttig:

    • Klar seriell buffer ved hjelp av seriell.Flush () -funksjon
    • Klar seriell buffer ved hjelp av seriell.Begynn () Funksjon

1: Klar seriell buffer ved hjelp av seriell.Flush () -funksjon

Så den første metoden som kan fjerne en Arduino -seriebuffer, bruker en serie.Flush () -funksjon. Denne funksjonen tilhører Arduino Serial Library -funksjonen.

Serie.Flush ()

Arduino Serial.Flush () -funksjonen venter på at dataene skal overføres fullstendig. I stedet for å forkaste de innkommende dataene, lar den de vente, så når dataene inne i bufferen overføres fullstendig, kan seriebufferen motta de nye dataene.

Merk: Etter å ha brukt seriell.Flush () -programmer kan ta mer tid å utføre og skrive ut utdata på seriemonitor. Per nå venter Arduino Code når alle data er overført, slik at den kan lagre nye data i minnet.

Syntaks

Serie.Flush ()

Parametere

Det tar bare en parameter.

Seriell: Seriell portobjekt

Returnerer

Denne funksjonen returnerer ingenting.

Eksempelkode

Her er koden som er skrevet uten å bruke seriell.FLUSH () FUNKSJON:

void setup ()
Serie.Begynn (9600);
usignert lang millis_flushstart = millis (); /*Startkode ved å lagre gjeldende Arduino Clock Time*/
Serie.Println (F ("Linuxhint.com/arduino "));
Serie.Println (F ("Linuxhint.com/braspberrypi "));
Serie.Println (F ("Linuxhint.com/tutorial "));
usignert lang millis_flushStop = millis (); /*Gjeldende tid på dette tidspunktet*/
Serie.print (f ("uten flush -funksjon det tar"));
Serie.Print (Millis_FLUSHSTOP - MILLIS_FLUSHSTART); /*Skriver ut tid tatt av seriell buffer for å skrive ut data*/
Serie.Println (F ("Millisekunder."));

void loop ()


I koden ovenfor initialiserte vi tre forskjellige strenger og startet koden ved å ta den nåværende tiden fra Millis () -funksjonen og lagre den i en ny variabel. Når dataene er skrevet ut igjen ved hjelp av Millis () -funksjonen, gir vi nåtiden til en ny variabel.

Når begge tiden er mottatt inne i to variabler, vil forskjellen gi oss tiden som Arduino tar for å trykke de tre definerte strengene i millisekunder.


I utgangsterminalen kan det sees at det tar 9ms å skrive ut den definerte strengen.


Nå i koden gitt nedenfor bruker vi serien.FLUSH () -funksjonen som lar alle strengene passere og vente der til seriebufferen blir tydelig for å motta neste data. Derfor vil det ta ekstra tid sammenlignet med utskriftsdata uten å bruke seriell.Flush ().

void setup ()
Serie.Begynn (9600);
usignert lang millis_flushstart = millis (); /*Startkode ved å lagre gjeldende Arduino Clock Time*/
Serie.Println (F ("Linuxhint.com/arduino "));
Serie.Println (F ("Linuxhint.com/braspberrypi "));
Serie.Println (F ("Linuxhint.com/tutorial "));
Serie.Flush (); /*Venter på at data skal overføres etter det spyleminnet*/
usignert lang millis_flushStop = millis (); /*Gjeldende tid på dette tidspunktet*/
Serie.print (f ("med flush -funksjon det tar"));
Serie.Print (Millis_FLUSHSTOP - MILLIS_FLUSHSTART); /*Skriver ut tid tatt av seriell buffer for å skrive ut data*/
Serie.Println (F ("Millisekunder."));

void loop ()


Denne koden ligner en vi forklarte tidligere. Forskjellen her er seriell.FLUSH () -funksjonen som gjør at programmet kan vente i litt ekstra tid til seriell bufferminne blir klart for å motta neste data.


I utgangen kan vi tydelig se at denne gangen tar det 76ms å skrive ut de tre strengene sammenlignet med den forrige som bare tar 9ms.

2: Klar seriell buffer ved hjelp av seriell.Begynn () Funksjon

Til nå forklarte vi funksjonsserien.FLUSH () For å fjerne seriebufferen, men denne funksjonen må vente på at dataene skal overføres helt nå kommer spørsmålene til tankene hva hvis vi vil tømme de innkommende dataene i seriebufferen. Svaret på spørsmålet er enkelt: vi kan gjøre dette ved hjelp av en samtidig som sløyfe med seriebibliotekfunksjonen.

Syntaks

mens (seriell.tilgjengelig())
Serie.lese();
Serie.slutt();
Serie.Begynn (9600);

Kode

Streng Val;
void setup ()

void loop ()
hvis (seriell.tilgjengelig ()) /*sjekk for seriedata* /
val = "";
mens (seriell.tilgjengelig ()) /*Les seriedata hvis tilgjengelig* /
char serial_data = seriell.lese();
val = val+serial_data; /*Lagre data i ny streng*/

Serie.println (val); /*Skriv ut lesedataene*/
Serie.slutt(); /*slutt seriell kommunikasjon*/
Serie.Begynn (9600); /*klar seriell buffer*/


Arduino bruker serie.Begynn () Funksjoner for å initialisere seriell kommunikasjon ved å definere baudhastighet, når denne funksjonen er initialisert, blir dataene som tidligere er lagret i Arduino -minne, klare. Her vil vi sjekke for seriedataene ved hjelp av serien.Tilgjengelig () Funksjon Når dataene er lest, lagres den i en ny streng og til slutt ved hjelp av seriell.Begynn (9600) Vi ​​vil fjerne Arduino -seriebufferen.

Merk: Vi må skylle seriebufferen fordi den sikrer at data er sendt til enheten og bare ikke venter eller på vent blir sendt.

Konklusjon

For å tømme Arduino -seriebufferen slik at den kan lagre nye data i Buffer Memory Serial.Flush () og Serial Begin kan brukes. Det kan brukes til å fjerne Arduino -seriebufferen, men vi må vente når alle data er overført for å unngå dette, vi kan bruke en stundsløyfe med serie.Begynn () Funksjon som også kan fjerne innkommende data fra seriell buffer.