Kaip išvalyti „Arduino“ serijos buferį

Kaip Isvalyti Arduino Serijos Buferi



„Arduino“ yra elektroninė platforma, kuri priima instrukcijas iš vartotojų kodo, žinomo kaip eskizas, forma ir atitinkamai generuoja išvestį. Norėdami surinkti instrukcijas ir apdoroti jas po vieną, „Arduino“ naudoja nuoseklųjį buferį. „Arduino“ serijos buferis saugo gaunamus duomenis, kol įrenginys bus paruoštas juos apdoroti. Kartais turime išvalyti „Arduino“ serijinį buferį, kad išvengtume gaunamų duomenų trukdžių. Pažiūrėkime tai išsamiau.

Arduino serijinis buferis

Taigi, mes visi žinome, kad „Arduino“ bendrauja naudodamas nuosekliojo ryšio protokolą, žinomą kaip USART. Taip, Arduino turi keletą kitų protokolų, tokių kaip SPI, I2C, tačiau USART yra labiausiai paplitęs ir dažniausiai naudojamas protokolas. Jei norite skaityti „Arduino“ visus tris protokolus, spustelėkite čia .







„Arduino“ serijos buferiai surenka gaunamus serijos simbolius ir laiko juos tol, kol mikrovaldiklis gali juos apdoroti. Serijinis ryšys yra duomenų perdavimo iš vieno įrenginio į kitą būdas. Arduino, naudodamas USART aparatinę įrangą savo plokštėse, kiekvieną 8 bitus surenka į baitą. Tada saugokite šiuos baitus nuosekliajame buferyje, daugiausia 64 baitai gali būti saugomi Arduino serijiniame buferyje.



Išvalykite „Arduino“ serijos buferį

„Arduino“ nuoseklieji buferiai turi ribotą atmintį duomenims saugoti, jei perpildyta atmintis arba prie serijinio kaiščio yra daug duomenų, pirmiausia turime išvalyti nuoseklųjį buferį, kad išsaugotume gaunamus duomenis. Išsiaiškinkime galimus Arduino serijinio buferio išvalymo būdus.



Arduino serijos buferio išvalymo būdai

Atlaisvinti nuosekliojo buferio vietos, kad ją būtų galima atnaujinti naujais duomenimis, gali būti naudinga toliau nurodytais dviem būdais.





    • Išvalykite nuoseklųjį buferį naudodami Serial.flush() funkciją
    • Išvalykite nuoseklųjį buferį naudodami Serial.begin() funkciją

1: Išvalykite nuoseklųjį buferį naudodami Serial.flush() funkciją

Taigi pirmasis metodas, kuriuo galima išvalyti Arduino serijinį buferį, yra Serial.flush() funkcijos naudojimas. Ši funkcija priklauso Arduino serijinės bibliotekos funkcijai.

Serial.flush()

Funkcija Arduino Serial.flush() laukia, kol duomenys bus visiškai perduoti. Užuot atmetę gaunamus duomenis, jis leidžia jiems palaukti, todėl kai buferyje esantys duomenys bus visiškai perduoti, serijinis buferis gali priimti naujus duomenis.



Pastaba : Panaudojus Serial.flush() programas gali prireikti daugiau laiko paleisti ir išspausdinti išvestį serijiniame monitoriuje. Nuo šiol „Arduino“ kodas laukia, kai visi duomenys bus perduoti, kad galėtų saugoti naujus duomenis savo atmintyje.

Sintaksė

Serial.flush ( )

Parametrai

Tam reikia tik vieno parametro.

Serijinis: Serijinio prievado objektas

Grąžina

Ši funkcija nieko negrąžina.

Kodo pavyzdys

Štai kodas, parašytas nenaudojant Serial.flush() funkcijos:

tuščias nustatymas ( ) {
Serialas.begin ( 9600 ) ;
nepasirašytas ilgas millis_FlushStart = milis ( ) ; /* Pradėkite kodą išsaugodami dabartinį Arduino laikrodį laikas */
Serial.println ( F ( „Linuxhint.com/Arduino“ ) ) ;
Serial.println ( F ( „Linuxhint.com/RaspberryPi“ ) ) ;
Serial.println ( F ( „Linuxhint.com/Tutorial“ ) ) ;
nepasirašytas ilgas millis_FlushStop = milis ( ) ; /* srovė laikas Šiuo atveju */
Serial.print ( F ( „Tai užtrunka be praplovimo funkcijos“ ) ) ;
Serial.print ( millis_FlushStop – millis_FlushStart ) ; /* Spaudiniai laikas paimamas serijiniu buferiu duomenims spausdinti */
Serial.println ( F ( 'milisekundės'. ) ) ;
}
tuščia kilpa ( ) {
}


Aukščiau pateiktame kode inicijavome tris skirtingas eilutes ir pradėjome kodą, paimdami dabartinį laiką iš funkcijos millis () ir išsaugodami jį naujame kintamajame. Kai duomenys vėl atspausdinami naudojant funkciją millis(), dabartinį laiką perduodame naujam kintamajam.

Kai abu laikas bus gautas dviejuose kintamuosiuose, skirtumas suteiks mums laiką, per kurį Arduino atspausdins tris apibrėžtas eilutes milisekundėmis.


Išvesties terminale matyti, kad apibrėžtai eilutei atspausdinti reikia 9 ms.


Dabar toliau pateiktame kode naudosime Serial.flush() funkciją, kuri leis perduoti visoms eilutėms ir laukti ten, kol nuoseklusis buferis taps aiškus, kad gautų kitus duomenis. Todėl tai užtruks daugiau laiko, palyginti su duomenų spausdinimu nenaudojant Serial.flush().

tuščias nustatymas ( ) {
Serialas.begin ( 9600 ) ;
nepasirašytas ilgas millis_FlushStart = milis ( ) ; /* Pradėkite kodą išsaugodami dabartinį Arduino laikrodį laikas */
Serial.println ( F ( „Linuxhint.com/Arduino“ ) ) ;
Serial.println ( F ( „Linuxhint.com/RaspberryPi“ ) ) ;
Serial.println ( F ( „Linuxhint.com/Tutorial“ ) ) ;
Serial.flush ( ) ; /* Laukia dėl duomenis, kurie turi būti perduodami po to, kai išvaloma atmintis */
nepasirašytas ilgas millis_FlushStop = milis ( ) ; /* srovė laikas Šiuo atveju */
Serial.print ( F ( 'Su praplovimo funkcija reikia' ) ) ;
Serial.print ( millis_FlushStop – millis_FlushStart ) ; /* Spaudiniai laikas paimamas serijiniu buferiu duomenims spausdinti */
Serial.println ( F ( 'milisekundės'. ) ) ;
}
tuščia kilpa ( ) {
}


Šis kodas yra panašus į tą, kurį paaiškinome anksčiau. Skirtumas čia yra Serial.flush() funkcija, leidžianti programai palaukti šiek tiek papildomo laiko, kol nuoseklioji buferinė atmintis bus laisva, kad būtų galima priimti kitus duomenis.


Išvestyje aiškiai matome, kad šį kartą trims eilutėms atspausdinti reikia 76 ms, palyginti su ankstesne, kuri užtrunka tik 9 ms.

2: Išvalykite nuoseklųjį buferį naudodami Serial.begin() funkciją

Iki šiol mes paaiškinome funkciją Serial.flush(), kad išvalytumėte nuoseklųjį buferį, tačiau ši funkcija turi palaukti, kol duomenys bus visiškai perduoti, dabar kyla klausimų, ką daryti, jei norime išvalyti gaunamus duomenis nuosekliajame buferyje. Atsakymas į klausimą paprastas: tai galime padaryti naudodami a kol kilpa su nuosekliosios bibliotekos funkcija.

Sintaksė

kol ( Serijinis.galima ( ) )
Serialas.skaityti ( ) ;
Serial.end ( ) ;
Serialas.begin ( 9600 ) ;

Kodas

Styga val;
tuščias nustatymas ( ) {
}
tuščia kilpa ( ) {
jeigu ( Serijinis.galima ( ) ) { /* patikrinti dėl serijiniai duomenys */
val = '' ;
kol ( Serijinis.galima ( ) ) { /* skaityti serijiniai duomenys jeigu prieinama */
char Serial_Data = Serialas.read ( ) ;
val =val+Serial_Data; /* saugoti duomenis naujoje eilutėje */
}
Serial.println ( val ) ; /* atsispausdinti skaityti duomenis */
Serial.end ( ) ; /* užbaigti serijinį ryšį */
Serialas.begin ( 9600 ) ; /* aišku serijinis buferis */
}
}


Arduino naudoja Serial.begin() funkcijas, kad inicijuotų nuoseklųjį ryšį, apibrėžiant perdavimo spartą, kai ši funkcija inicijuojama, anksčiau Arduino atmintyje saugomi duomenys tampa aiškūs. Čia mes patikrinsime serijinius duomenis naudodami funkciją Serial.available() kai tik duomenys bus nuskaityti, jie bus saugomi naujoje eilutėje ir galiausiai naudodami Serial.begin(9600) išvalysime Arduino serijinį buferį.

Pastaba: Turime išvalyti nuoseklųjį buferį, nes jis užtikrina, kad duomenys buvo išsiųsti į įrenginį ir tiesiog nelaukia arba sulaikomi, kol bus išsiųsti.

Išvada

Norėdami išvalyti Arduino serijinį buferį, kad jis galėtų saugoti naujus duomenis buferio atmintyje, galima naudoti Serial.flush() ir Serial begin. Jį galima naudoti norint išvalyti „Arduino“ nuoseklųjį buferį, tačiau turime palaukti, kai visi duomenys bus perduoti, kad to išvengtume. Galime naudoti ciklą, naudojant Serial.begin() funkciją, kuri taip pat gali išvalyti gaunamus duomenis iš serijinio buferio.