Arduino Polska Forum

Pełna wersja: Wysyłanie dużych wiadomości poprzez serial
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam, próbuje stworzyć oświetlenie ambient do mojego monitora poprzez zbieranie informacji o średnim kolorze w 114 kwadratach po brzegach mojego monitora. Stworzyłem skrypt w Pythonie który zbiera dla mnie te informacje i przechowuje w liście w postaci koloru HEX. Jako że kwadratów jest 114 a w przypadku wysłania dochodzi jeszcze przecinek, łącznie będę wysyłał jednocześnie 912 znaków. Nie jestem obiegany z Serial, ale najwyższa ilość znaków jaką udało mi się wysłać i odebrać poprzez Arduino to 219. Czy jest możliwość wysłania takiej długiej wiadomości? A może któryś z was ma lepszy pomysł jak te informacje przekazać. Pozdrawiam.
Bufor seriala ma coś około 64 bajtów, więc do momentu kiedy odczytujesz na tyle szybko, że dane w buforze się nie kumulują ponad tą wartość, powinieneś dać radę przepchnąć te dane znak po znaku. Po odebraniu zapisujesz w jakimś array'u i interpretujesz dane.

Problemem może być prędkość samej transmisji. Przy 9600 masz 960 znaków na sekundę plus "obrobienie" odebranych danych, co słabo rokuje jeżeli chodzi o Twoje zastosowania.

Także jak dla mnie zabawa z doborem prędkości transmisji albo z wielkością bufora transmisji szeregowej.
Bufor serial-a można zwiększyć do zapotrzebowania.
(06-04-2024, 06:07)Jarewa0606 napisał(a): [ -> ]Bufor serial-a można zwiększyć do zapotrzebowania.

Masz na myśli jakąś metodę obiektu Serial, czy dorobienie własnej obsługi?
W pliku Hardwareserial.h jest coś takiego:
SERIAL_TX_BUFFER_SIZE

tu bym szukał.
Dokładnie tam w core. tylko Uno zbytnio się nie nadaje bo zeżre sporo pamięci ram a tam szastać zbytnio nie ma czym, wybrał bym esp do tego projektu lub mega.
(06-04-2024, 08:36)MadMrQ napisał(a): [ -> ]W pliku Hardwareserial.h jest coś takiego:
SERIAL_TX_BUFFER_SIZE

tu bym szukał.

Czyli taka "customizacja" biblioteki.
Oczywiście w przypadku kolegi @grzechutex raczej potrzebna będzie zmiana dla bufora odczytu SERIAL_RX_BUFFER_SIZE.

Możesz próbować wysyłać dane pakietami - np. w taki sposób, że urządzenie wysyłające czeka na potwierdzenie odbioru pierwszego pakietu zanim wyśle drugi, ale to burzy całą ideę transmisji asynchronicznej jaką jest Serial.

Do mrugania LEDami możesz przetestować:
https://github.com/FastLED/FastLED
(06-04-2024, 20:14)MadMrQ napisał(a): [ -> ]Oczywiście w przypadku kolegi @grzechutex raczej potrzebna będzie zmiana dla bufora odczytu SERIAL_RX_BUFFER_SIZE.

Możesz próbować wysyłać dane pakietami - np. w taki sposób, że urządzenie wysyłające czeka na potwierdzenie odbioru pierwszego pakietu zanim wyśle drugi, ale to burzy całą ideę transmisji asynchronicznej jaką jest Serial.

Do mrugania LEDami możesz przetestować:
https://github.com/FastLED/FastLED

Nie sądze by problemem była prędkość. Dane serialem idą na tyle wolno, że atmega spokojnie obrobi je na bieżąco, ale można to zrobić pod warunkiem, że dane będą przesyłane w taki sposób, że nie będzie potrzeby skompletowania całości komunikatu, że na podstawie kilku znaków można będzię ustalić kolor jakiegoś LEDa i zapomnieć o odebranych danych. Jakiś znacznik początku, potem kolejne liczby powodują wysterowanie poszczególnych LEDów - kolejno w miarę jak dane nadchodzą. Ten znacznik początku dla synchronizacji ramki - może być nawet nowa linia. Prosty automat stanów taktowany odbieranymi znakami. bez dłuższej pauzy na jakąkolwiek czynność. Największy problem sam wskazałeś - będzie można sterować tym podświetleniem raz na sekundę.


A stosowanie jakiegoś flow-control w tego typu real-time-owej aplikacji jest bez sensu - jak się nie wyrobimy, to lepiej zapomnieć w starociach i wziąć aktualne dane.
(05-04-2024, 20:17)grzechutex napisał(a): [ -> ]Witam, próbuje stworzyć oświetlenie ambient do mojego monitora poprzez zbieranie informacji o średnim kolorze w 114 kwadratach po brzegach mojego monitora. Stworzyłem skrypt w Pythonie który zbiera dla mnie te informacje i przechowuje w liście w postaci koloru HEX. Jako że kwadratów jest 114 a w przypadku wysłania dochodzi jeszcze przecinek, łącznie będę wysyłał jednocześnie 912 znaków. Nie jestem obiegany z Serial, ale najwyższa ilość znaków jaką udało mi się wysłać i odebrać poprzez Arduino to 219. Czy jest możliwość wysłania takiej długiej wiadomości? A może któryś z was ma lepszy pomysł jak te informacje przekazać. Pozdrawiam.

1. przecinek przecież jest zbędny, bo separatorem może być znak #

2. ja nieraz stosowałem swoje algorytmy kompresji w grach..., w tym przypadku masz sporo możliwości co zmniejszy twój strumień do np 50 znaków jak nie mniej

 000 to znak G
 111 to znak H
 00 to znak I
 11 to znak J
 01 to znak K
 10 to znak L
 ... i.t.d.