Uzgred serial.read() funkcija kod Arduino je BLOCKING tipa sto u prevodu znaci da ce funkcija cekati dok se ne iscita sve sto je stiglo na liniju (u interni buffer funkcije, cekajuci dok ne stigne CR\LF ili NULL karakter) i ne moze da se predje na sledecu funkciju dok se ta operacija ne zavrsi, dakle BLOKIRA se dalji rad dok ne iscita.
Kod malih brzina prenosa je to ogroman problem jer se ceo program blokira za to vreme a mogao je hiljade nekih drugih instrukijza da uradi dok ceka podatak!
Iz tih razloga postoji NON-BLOCKING pristup gde se to radi malo drugacije preko DMA i Interupt rutina.
Podatak se iscitava karakter po karakter preko interupta, upisuje preko DMA u rezervisani buffer i ceka se statusni flag za IDLE od USART-a koji znaci prakticno kraj prenosa paketa podataka i naj taj nacin mogu da se primaju paketi razlicite duzine i sto je najbitnije mogu da sadrze NULL (0x00) karakter u sebi, dakle binarni prenos podataka.
Interapt (ISR) rutina radi jedan po jedan karakter i ta operacija je veoma brza tako da ne blokira ostatak programa i na kraju setuje neki flag u programu "stigao_paket" i program odradi sta treba, ima duzinu + binardni sadrzaj u bufferu i to je to!
Sa ovim pristupom citanja, glavna petlja moze da se ubrza nekoliko hiljada puta, radi kao da ga "nema", "u pozadini", minimalno resursa oduzima.
[Ovu poruku je menjao mikikg dana 24.11.2019. u 14:40 GMT+1]