Arduino Seri Tamponu Nasıl Temizlenir

Arduino Seri Tamponu Nasil Temizlenir



Arduino, kullanıcılardan taslak olarak bilinen kod şeklinde talimat alan ve buna göre çıktı üreten elektronik bir platformdur. Talimatları toplamak ve bunları birer birer işlemek için Arduino bir seri arabellek kullanır. Arduino seri arabelleği, cihaz bunları işlemeye hazır olana kadar gelen verileri tutar. Bazen gelen verilerle etkileşimi önlemek için Arduino seri arabelleğini temizlememiz gerekir. Bunu daha ayrıntılı olarak görelim.

Arduino Seri Tamponu

Bu yüzden hepimiz Arduino'nun USART olarak bilinen seri iletişim protokolünü kullanarak iletişim kurduğunu biliyoruz. Evet, Arduino'nun SPI, I2C gibi başka protokolleri vardır ancak USART en yaygın ve sık kullanılan protokoldür. Arduino'nun üç protokolü de okumakla ilgileniyorsanız, tıklayın burada .







Arduino seri arabellekleri, gelen seri karakterleri toplar ve mikrodenetleyici bunları işleyebilene kadar tutar. Seri iletişim, bir cihazdan diğerine veri aktarma yöntemidir. Kartlarında USART donanımını kullanan Arduino, her 8 biti bir bayt olarak birleştirir. Daha sonra bu baytları seri arabellekte saklayın, Arduino seri arabelleğinde maksimum 64 bayt saklanabilir.



Arduino Seri Tamponunu Temizle

Arduino seri arabellekleri, bellek taşması veya seri pinde büyük miktarda veri olması durumunda veri depolamak için sınırlı belleğe sahiptir, gelen verileri depolamak için önce seri arabelleği temizlememiz gerekir. Arduino seri arabelleğini temizlemenin olası yollarını bulalım.



Arduino Seri Tamponunu Temizlemenin Yolları

Yeni verilerle güncellenebilmesi için seri arabellek alanını boşaltmak için aşağıdaki iki yol yardımcı olabilir:





    • Serial.flush() İşlevini Kullanarak Seri Arabelleğini Temizleme
    • Serial.begin() İşlevini kullanarak Seri Arabelleğini Temizleme

1: Serial.flush() İşlevini kullanarak Seri Arabelleğini Temizle

Bu nedenle, bir Arduino seri arabelleğini temizleyebilen ilk yöntem, Serial.flush() işlevini kullanmaktır. Bu fonksiyon Arduino seri kütüphane fonksiyonuna aittir.

Seri.flush()

Arduino Serial.flush() işlevi verilerin tamamen iletilmesini bekler. Gelen verileri atmak yerine beklemesine izin verir, böylece arabellek içindeki veriler tamamen iletildikten sonra Seri arabellek yeni verileri alabilir.



Not : Serial.flush() programlarını kullandıktan sonra, çıktıların seri monitörde çalıştırılması ve yazdırılması daha fazla zaman alabilir. Şu andan itibaren Arduino kodu, tüm veriler iletildikten sonra bekler, böylece yeni verileri hafızasında saklayabilir.

Sözdizimi

seri. yıkama ( )

parametreler

Sadece bir parametre alır.

Seri: Seri bağlantı noktası nesnesi

İadeler

Bu işlev hiçbir şey döndürmez.

Örnek Kod

İşte Serial.flush() fonksiyonu kullanılmadan yazılan kod:

geçersiz kurulum ( ) {
seri.başla ( 9600 ) ;
imzasız uzun millis_FlushStart = millis ( ) ; /* Mevcut Arduino saatini kaydederek kodu başlatın zaman */
Seri.println ( F ( 'Linuxhint.com/Arduino' ) ) ;
Seri.println ( F ( 'Linuxhint.com/RaspberryPi' ) ) ;
Seri.println ( F ( 'Linuxhint.com/Öğretici' ) ) ;
imzasız uzun millis_FlushStop = millis ( ) ; /* akım zaman bu noktada */
Seri.baskı ( F ( 'Flush Fonksiyonu Olmadan Alır' ) ) ;
Seri.baskı ( millis_FlushStop - millis_FlushStart ) ; /* Baskılar zaman verileri yazdırmak için seri arabellek tarafından alınır */
Seri.println ( F ( 'milisaniye.' ) ) ;
}
boşluk döngüsü ( ) {
}


Yukarıdaki kodda üç farklı karakter dizisini başlattık ve millis() fonksiyonundan o anki zamanı alıp yeni bir değişkene kaydederek kodu başlattık. Veriler millis() işlevi kullanılarak tekrar yazdırıldığında, şimdiki zamanı yeni bir değişkene geçiririz.

Her iki zaman da iki değişken içinde alındığında, fark bize Arduino tarafından tanımlanan üç diziyi milisaniye cinsinden yazdırmak için geçen süreyi verecektir.


Çıkış terminalinde, tanımlanan dizgiyi yazdırmanın 9 ms sürdüğü görülebilir.


Şimdi aşağıda verilen kodda, tüm dizgilerin geçmesine ve bir sonraki veriyi almak için seri arabellek temizlenene kadar orada beklemesine izin verecek olan Serial.flush() işlevini kullanacağız. Bu nedenle, Serial.flush() kullanmadan veri yazdırmaya kıyasla fazladan zaman alacaktır.

geçersiz kurulum ( ) {
seri.başla ( 9600 ) ;
imzasız uzun millis_FlushStart = millis ( ) ; /* Mevcut Arduino saatini kaydederek kodu başlatın zaman */
Seri.println ( F ( 'Linuxhint.com/Arduino' ) ) ;
Seri.println ( F ( 'Linuxhint.com/RaspberryPi' ) ) ;
Seri.println ( F ( 'Linuxhint.com/Öğretici' ) ) ;
seri. yıkama ( ) ; /* bekler için bu boşaltma belleğinden sonra iletilecek veriler */
imzasız uzun millis_FlushStop = millis ( ) ; /* akım zaman bu noktada */
Seri.baskı ( F ( 'Flush Fonksiyonu ile ' ) ) ;
Seri.baskı ( millis_FlushStop - millis_FlushStart ) ; /* Baskılar zaman verileri yazdırmak için seri arabellek tarafından alınır */
Seri.println ( F ( 'milisaniye.' ) ) ;
}
boşluk döngüsü ( ) {
}


Bu kod daha önce açıkladığımız koda benzer. Buradaki fark, programın bir sonraki veriyi almak için seri tampon belleği temizlenene kadar fazladan bir süre beklemesine izin veren Serial.flush() işlevidir.


Çıktıda açıkça görebiliyoruz ki, bu sefer sadece 9ms alan öncekine kıyasla üç dizeyi yazdırmak 76ms sürüyor.

2: Serial.begin() İşlevini kullanarak Seri Arabelleğini Temizleyin

Şimdiye kadar seri tamponu temizlemek için Serial.flush() fonksiyonunu açıkladık ama bu fonksiyon verinin tamamen iletilmesini beklemek zorunda, şimdi akla gelen sorular seri tampon içindeki gelen verileri temizlemek istiyorsak ne olacak. Sorunun cevabı basit: Bunu kullanarak yapabiliriz. süre Seri kitaplık işleviyle döngü.

Sözdizimi

süre ( seri.mevcut ( ) )
seri.oku ( ) ;
seri.son ( ) ;
seri.başla ( 9600 ) ;

kod

dize değeri;
geçersiz kurulum ( ) {
}
boşluk döngüsü ( ) {
eğer ( seri.mevcut ( ) ) { /* Kontrol için seri veri */
değer = '' ;
süre ( seri.mevcut ( ) ) { /* okuman seri veri eğer mevcut */
karakter Seri_Veri = Seri.oku ( ) ;
val =val+Seri_Veri; /* verileri yeni dize içinde depola */
}
Seri.println ( val ) ; /* yazdır okuman veri */
seri.son ( ) ; /* seri iletişimi sonlandır */
seri.başla ( 9600 ) ; /* açık seri arabellek */
}
}


Arduino, baud hızını tanımlayarak seri iletişimi başlatmak için Serial.begin() işlevlerini kullanır, bu işlev başlatıldığında Arduino belleğinde önceden depolanan veriler netleşir. Burada, Serial.available() işlevini kullanarak seri verileri kontrol edeceğiz, veriler okunduğunda yeni bir dize içinde depolayacak ve son olarak Serial.begin(9600) kullanarak Arduino seri arabelleğini temizleyeceğiz.

Not: Verilerin cihaza gönderilmesini ve gönderilmeyi beklememesini veya beklemede olmamasını sağladığı için seri arabelleği temizlememiz gerekir.

Çözüm

Arduino seri arabelleğini, yeni verileri arabellek içinde saklayabilmesi için temizlemek için Serial.flush() ve Serial başlangıç ​​kullanılabilir. Arduino seri arabelleğini temizlemek için kullanılabilir, ancak bundan kaçınmak için tüm veriler iletildikten sonra beklememiz gerekiyor, Serial.begin() işleviyle seri arabellekten gelen verileri de temizleyen bir while döngüsü kullanabiliriz.