• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
serial i lagi w transmisji
#1
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

   

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

   
   
   
   
   
 
Odpowiedź
#2
nie korzystasz z przerywania?? albo timerów??
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#4
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.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#5
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 ?
 
Odpowiedź
#6
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.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#7
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#8
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.
 
Odpowiedź
#9
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ł.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości