Liczba postów: 4
Liczba wątków: 1
Dołączył: Dec 2022
Reputacja:
0
31-12-2022, 15:45
Witajcie!
Jestem tu nowy i stosunkowo od niedawna zajmuję się Arduino. Mam chyba dość prosty problem, ale nie mogę się z nim uporać. Mianowicie wysyłam sobie przez USB do Arduino jakiś ciąg znaków 130 bajtów. W programie mam dwie zmienne: jedna to liczba porządkowa danej litery, która zwiększa się o jeden na poczatku pętli, a druga to zmienna, która przechowuje odczytaną w danym przejściu pętli. Następnie program wypisuje przez Serial.print l. porządkową, odstęp i kod danej litery w hex-ie, czyli tak jak chcę. Wszystko działa pięknie, ale nie chce wypisać wiecej, jak 82 litery. Czyżby chodziło o przepełnienie bufora portu szeregowego w Arduino?
Liczba postów: 2,364
Liczba wątków: 0
Dołączył: Oct 2017
Reputacja:
240
Program jest aż tak tajny by go tu nie pokazać? Bufor w UNO to 1 bajt czy dwa, programowy ma 32 lub 64 i tu dane trafiają w przerwaniach, bajty trzeba po odebraniu przepisać do swojego bufora/zmiennej jak najszybciej, albo część danych zostanie utracona. Przepisanie znaku z bufora trwa poniżej us, czyli można ich w sekundzie obrobić milion*, ale jak się w loop wstawi delay to nie można.
Można też znaleźć plik z definicjami serial w core Arduino i zmienić sobie domyślną wielkość bufora kołowego dla UART/SERIAL, czyli wielkość tego bufora niezależnego od Twoich zmagań w loop, można zmniejszyć prędkość UART jak się UNO nie wyrabia.
*bardziej w 1ms 1000, bo faktycznie "obrobić" w Uno więcej niż ma ram to np. wrzuć w niebyt.
Liczba postów: 4
Liczba wątków: 1
Dołączył: Dec 2022
Reputacja:
0
Dziekuję za odpowiedź! Spróbuję zajrzeć do tego core-a.
Kod oczywiście nie jest tajny, ale w tym momencie jest tak rozgrzebany, że nawet się nie kompiluje. Muszę posprzątać. A czy dałoby się coś osiągnąć programową albo sprzętową kontrolą przepływu, np takie coś, że jak sierial.available() już jest przy końcu (np. 58 bajtów) to wysyła Xoff, żeby komputer wstrzymał przesyłanie, potem schodzi sobie to powiedzmy do 10 bajtów i wysyła Xon?
Liczba postów: 868
Liczba wątków: 19
Dołączył: Jun 2018
Reputacja:
42
To po co tak często wysyłasz jak nie jesteś wstanie tego odbierać? Nie rozumiem twojego podejścia chcesz przypudrować problem zamiast go rozwiązać..
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą.
Liczba postów: 2,364
Liczba wątków: 0
Dołączył: Oct 2017
Reputacja:
240
Nie wiem czy używasz software serial, ale jak tak to w ogóle bieda.
Używaj hardware serial, sprzętowy, a on jest w core, gdzieś tu ...\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\
Programowy w ogóle nie ma nawet tych 2 bajtów bufora sprzętowego, tylko co programowo złapie w 64 bajty.
Jak nie możesz wysyłać wolniej to użyj ESP 8266 lub ESP32, płytki są tańsze niż Arduino UNO/NANO (na dzisiaj), bufor sprzętowy jest większy niż kołowy w UNO.
Liczba postów: 4
Liczba wątków: 1
Dołączył: Dec 2022
Reputacja:
0
Działa! Dzięki!
Grzebałem oczywiście nie w tym pliku. Przecież chodziło mi o hardware-owy interfejs.