Jak wyczyścić bufor szeregowy Arduino?

Jak Wyczyscic Bufor Szeregowy Arduino



Arduino to platforma elektroniczna, która pobiera instrukcje od użytkowników w postaci kodu znanego jako szkic i odpowiednio generuje dane wyjściowe. Aby zebrać instrukcje i przetworzyć je jedna po drugiej, Arduino wykorzystuje bufor szeregowy. Szeregowy bufor Arduino przechowuje przychodzące dane, dopóki urządzenie nie będzie gotowe do ich przetworzenia. Czasami musimy wyczyścić bufor szeregowy Arduino, aby uniknąć ingerencji w przychodzące dane. Zobaczmy to bardziej szczegółowo.

Bufor szeregowy Arduino

Tak więc wszyscy wiemy, że Arduino komunikuje się za pomocą protokołu komunikacji szeregowej znanego jako USART. Tak, Arduino ma kilka innych protokołów, takich jak SPI, I2C, ale USART jest najpopularniejszym i najczęściej używanym protokołem. Jeśli interesuje Cię odczyt wszystkich trzech protokołów Arduino, kliknij tutaj .







Bufory szeregowe Arduino zbierają przychodzące znaki szeregowe i przechowują je, dopóki mikrokontroler nie będzie mógł ich przetworzyć. Komunikacja szeregowa to metoda przesyłania danych z jednego urządzenia do drugiego. Arduino używając sprzętu USART na swoich płytach składa każde 8 bitów w bajt. Następnie przechowuj te bajty w buforze szeregowym, maksymalnie 64 bajty można przechowywać w buforze szeregowym Arduino.



Wyczyść bufor szeregowy Arduino

Bufory szeregowe Arduino mają ograniczoną pamięć do przechowywania danych w przypadku przepełnienia pamięci lub dużej ilości danych na pinie szeregowym, musimy najpierw wyczyścić bufor szeregowy, aby przechowywać dane przychodzące. Sprawdźmy możliwe sposoby wyczyszczenia bufora szeregowego Arduino.



Sposoby czyszczenia bufora szeregowego Arduino

Aby zwolnić miejsce w buforze szeregowym, aby można go było aktualizować o nowe dane, pomocne mogą być następujące dwa sposoby:





    • Wyczyść bufor szeregowy za pomocą funkcji Serial.flush()
    • Wyczyść bufor szeregowy za pomocą funkcji Serial.begin()

1: Wyczyść bufor szeregowy za pomocą funkcji Serial.flush()

Tak więc pierwszą metodą, która może wyczyścić bufor szeregowy Arduino, jest użycie funkcji Serial.flush(). Ta funkcja należy do funkcji biblioteki szeregowej Arduino.

Serial.flush()

Funkcja Arduino Serial.flush() czeka na pełne przesłanie danych. Zamiast odrzucać przychodzące dane, pozwala mu czekać, więc gdy dane w buforze zostaną całkowicie przesłane, bufor szeregowy może odebrać nowe dane.



Notatka : Po użyciu Serial.flush() programy mogą potrzebować więcej czasu na wykonanie i wydrukowanie danych wyjściowych na monitorze szeregowym. Od teraz kod Arduino czeka na przesłanie wszystkich danych, dzięki czemu może przechowywać nowe dane w swojej pamięci.

Składnia

Serial.spłukiwanie ( )

Parametry

Zajmuje tylko jeden parametr.

Seryjny: Obiekt portu szeregowego

Zwroty

Ta funkcja nic nie zwraca.

Przykładowy kod

Oto kod napisany bez użycia funkcji Serial.flush():

pusta konfiguracja ( ) {
Serial.początek ( 9600 ) ;
unsigned long millis_FlushStart = millis ( ) ; /* Uruchom kod, zapisując aktualny zegar Arduino czas */
Serial.println ( F ( „Linuxhint.com/Arduino” ) ) ;
Serial.println ( F ( „Linuxhint.com/RaspberryPi” ) ) ;
Serial.println ( F ( „Linuxhint.com/Samouczek” ) ) ;
unsigned long millis_FlushStop = millis ( ) ; /* obecny czas w tym momencie */
Serial.print ( F ( 'Bez funkcji spłukiwania to trwa' ) ) ;
Serial.print ( millis_FlushStop - millis_FlushStart ) ; /* Wydruki czas pobierane przez bufor szeregowy do drukowania danych */
Serial.println ( F ( „milisekundy”. ) ) ;
}
pusta pętla ( ) {
}


W powyższym kodzie zainicjalizowaliśmy trzy różne łańcuchy i rozpoczęliśmy kod, pobierając aktualny czas z funkcji millis() i zapisując go w nowej zmiennej. Po ponownym wydrukowaniu danych za pomocą funkcji millis() przekazujemy czas teraźniejszy do nowej zmiennej.

Gdy oba czasy zostaną odebrane w dwóch zmiennych, różnica da nam czas potrzebny Arduino na wydrukowanie trzech zdefiniowanych ciągów w milisekundach.


W terminalu wyjściowym widać, że wydrukowanie zdefiniowanego ciągu trwa 9 ms.


Teraz w kodzie podanym poniżej użyjemy funkcji Serial.flush(), która pozwoli na przejście wszystkich ciągów i poczeka tam, aż bufor szeregowy stanie się czysty, aby otrzymać następne dane. Dlatego zajmie to więcej czasu w porównaniu do drukowania danych bez użycia Serial.flush().

pusta konfiguracja ( ) {
Serial.początek ( 9600 ) ;
unsigned long millis_FlushStart = millis ( ) ; /* Uruchom kod, zapisując aktualny zegar Arduino czas */
Serial.println ( F ( „Linuxhint.com/Arduino” ) ) ;
Serial.println ( F ( „Linuxhint.com/RaspberryPi” ) ) ;
Serial.println ( F ( „Linuxhint.com/Samouczek” ) ) ;
Serial.spłukiwanie ( ) ; /* Czeka dla dane do przesłania po tej opróżnionej pamięci */
unsigned long millis_FlushStop = millis ( ) ; /* obecny czas w tym momencie */
Serial.print ( F ( 'Z funkcją spłukiwania to trwa' ) ) ;
Serial.print ( millis_FlushStop - millis_FlushStart ) ; /* Wydruki czas pobierane przez bufor szeregowy do drukowania danych */
Serial.println ( F ( „milisekundy”. ) ) ;
}
pusta pętla ( ) {
}


Ten kod jest podobny do tego, który wyjaśniliśmy wcześniej. Różnicą jest tutaj funkcja Serial.flush(), która pozwala programowi poczekać przez pewien dodatkowy czas, aż pamięć bufora szeregowego stanie się wolna do odbierania następnych danych.


Na wyjściu widać wyraźnie, że tym razem wydrukowanie trzech ciągów zajmuje 76 ms w porównaniu z poprzednim, który zajmuje tylko 9 ms.

2: Wyczyść bufor szeregowy za pomocą funkcji Serial.begin()

Do tej pory wyjaśniliśmy funkcję Serial.flush() do czyszczenia bufora szeregowego, ale ta funkcja musi czekać na pełne przesłanie danych, teraz nasuwają się pytania, co jeśli chcemy wyczyścić przychodzące dane wewnątrz bufora szeregowego. Odpowiedź na pytanie jest prosta: możemy to zrobić za pomocą a podczas gdy pętla z funkcją biblioteki szeregowej.

Składnia

podczas gdy ( Serial.dostępny ( ) )
Serial.odczyt ( ) ;
Serial.koniec ( ) ;
Serial.początek ( 9600 ) ;

Kod

Wartość ciągu;
pusta konfiguracja ( ) {
}
pusta pętla ( ) {
jeśli ( Serial.dostępny ( ) ) { /* sprawdzać dla dane seryjne */
wart = '' ;
podczas gdy ( Serial.dostępny ( ) ) { /* czytać dane seryjne jeśli do dyspozycji */
zwęglać Serial_Dane = Serial.odczyt ( ) ;
wartość =wartość+dane_seryjne; /* przechowuj dane w nowym ciągu */
}
Serial.println ( wartość ) ; /* wydrukuj czytać dane */
Serial.koniec ( ) ; /* koniec komunikacji szeregowej */
Serial.początek ( 9600 ) ; /* jasne bufor szeregowy */
}
}


Arduino używa funkcji Serial.begin() do inicjalizacji komunikacji szeregowej poprzez zdefiniowanie szybkości transmisji, po zainicjowaniu tej funkcji dane zapisane wcześniej w pamięci Arduino stają się jasne. Tutaj sprawdzimy dane szeregowe za pomocą funkcji Serial.available(), gdy dane zostaną odczytane, zostaną one zapisane w nowym ciągu, a na koniec za pomocą Serial.begin(9600) wyczyścimy bufor szeregowy Arduino.

Notatka: Musimy opróżnić bufor szeregowy, ponieważ zapewnia on, że dane zostały wysłane do urządzenia i po prostu nie czekają ani nie są zawieszone na wysłanie.

Wniosek

Aby wyczyścić bufor szeregowy Arduino, aby mógł przechowywać nowe dane w pamięci buforowej, można użyć Serial.flush() i Serial begin. Można go użyć do wyczyszczenia bufora szeregowego Arduino, ale musimy poczekać, gdy wszystkie dane zostaną przesłane, aby tego uniknąć, możemy użyć pętli while z funkcją Serial.begin(), która może również wyczyścić przychodzące dane z bufora szeregowego.