Arduino Polska Forum
serial i lagi w transmisji - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Programowanie w Arduino (https://forum.arduinopolska.pl/dzial-programowanie-w-arduino)
+--- Wątek: serial i lagi w transmisji (/watek-serial-i-lagi-w-transmisji)



serial i lagi w transmisji - drakston - 08-07-2020

witam

Prosiłbym o pomoc/sugestie w czym szukać przyczyny. Odbieram dane serial w pętli głównej programu i robię echo czyli od razu chcę wysłać dalej to co otrzymałem.

Kod:
while (Serial.available()) {
unsigned char inStr = Serial.read();
Serial.write(inStr);
}

Z początku miałęm if a nie while i otrzymując na wejsciu ramkę bajtów, każdy bajt na wyjściu był odseparowany opóźnieniem 50ms

[attachment=1029]

przy while jest ok ale opoźnienie pomiędzy otrzymaniem a wysłaniem jest różne. Poniżej kilka zrzutów jak to wygląda, czasami nawet pomiędzy bajtami jest większy odstęp.

Może mi ktoś wyjaśnić dlaczego takie opóźnienia?

żółty wykres to dane przychodzące na pinie RX, niebieski to pomiar pinu TX

[attachment=1030]
[attachment=1031]
[attachment=1032]
[attachment=1033]
[attachment=1034]


RE: serial i lagi w transmisji - Jarewa0606 - 08-07-2020

nie korzystasz z przerywania?? albo timerów??


RE: serial i lagi w transmisji - kaczakat - 09-07-2020

Serial w Arduino działa na przerwaniach, czyli odbiornik zawsze jest gotowy do odbioru i zawsze natychmiast przepisuje odebrany bajt do bufora programowego biblioteki Serial (chyba że ktoś/coś wyłącza przerwania), a to co widać w kodzie powyższym, czyli odczyt z bufora i wysłanie dalej zależy od tego co jeszcze poza tym widocznym kodem uC robi w pętli loop. Sprzętowego bufora w UNO jest tyle, że jak jest odebrany bajt w buforze to można jeszcze odczytywać następny, nieodczytanie natychmiast (np. wyłączeniem przerwań) powoduje utratę danych.
Zapis działa podobnie, czyli .write tylko zapisuje do bufora, potem przerwania wysyłają kolejne bajty do nadajnika gdy jest pusty.


RE: serial i lagi w transmisji - Robson Kerman - 09-07-2020

Możesz przenieść ten kod do funkcji obsługi przerwania:
Kod:
void serialEvent(){
while (Serial.available()) {
unsigned char inStr = Serial.read();
Serial.write(inStr);
}
}
Oczywiście, jeśli Twoje Arduino taką obsługuje.


RE: serial i lagi w transmisji - drakston - 10-07-2020

Faktycznie jeśli wywalę resztę programu i zostawię tylko echo to transmisja jest natychmiastowa.

Jeśli wrzucę echo w serialEvent to też są różne opoźnienia jak w pętli głównej, co mnie trochę dziwi bo serialEvent chyba bazuje na ISR ?


RE: serial i lagi w transmisji - Jarewa0606 - 10-07-2020

Ale ICP ma większy priorytet....później wykonuje wedle kolejności. Dlatego serial event wcale nie wykona się natychmiastowo jeśli wisi na jakimś innym przerwaniu.


RE: serial i lagi w transmisji - kaczakat - 11-07-2020

Miałem to sprawdzić i dopiero napisać:
"Jak nie obsługuje to można sobie dopisać w loop wywołanie serialEvent(), no i oba będą działać tak samo. W UNO, gdzie to działa, serialEvent jest po prostu doklejany do kodu loop po cichu, przynajmniej tak mi się wydaje. Jak wstawi w loop delay(1000) to tyle max będzie czekał. Żeby było natychmiast to musiałby mieć swoją bibliotekę lub grzebać w istniejącej, w faktycznej funkcji obsługi przerwania."
, ale już sam to potwierdziłeś...
W loop trzeba sobie dopisać dla np. Arduino Leonardo, Micro, DUE, ESP8266.


RE: serial i lagi w transmisji - drakston - 11-07-2020

Spróbuje z dopisaniem normalnie obsługi przerwania ISR USART i tyle bo te serialEvent to ściema, jeśli to jest tylko to że wykonuje się jako pierwszy w pętli głównej przed resztą kodu to mało użyteczne.


RE: serial i lagi w transmisji - Robson Kerman - 11-07-2020

Tylko, że 
Kod:
ISR(USART_RX_vect)

na Arduino nie pójdzie. Wyskoczy Ci jakiś konflikt czy coś w ten deseń.

Jak chcesz normalnie programować, to musisz to robić w normalnym języku i w normalnym IDE.
Ja wiem, że to tak wspaniale brzmi - ekosystem, i pierdylion wspaniałych inteligentnych płytek itp., ale w systemach wbudowanych czas jest priorytetem, a ekosystem Arduino chyba o tym zapomniał.