• 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
Arduino nie odczytuje wszystkich przesłanych bajtów
#1
Star 
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?
 
Odpowiedź
#2
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
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?
 
Odpowiedź
#4
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ą. 
 
Odpowiedź
#5
Cytat:To po co tak często wysyłasz jak nie jesteś wstanie tego odbierać?
Dane wysyła monitor portu (drukowanie) Windows. Póki co nie potrafię go zmusić do wolniejszego przesyłu danych. Zmiana baudrate-u też nic nie pomaga.
 
Cytat: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.

Rozumiem, że ma Kolega na myśli plik SoftwareSerial.h z lokalizacji:
\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.4\libraries\SoftwareSerial\src.
Jest tam parametr _SS_MAX_RX_BUFF 64. Zmieniałem go zarówno w górę (na 512), jak i w dół. Owszem, zmienia się rozmiar programu i jego zmiennych przy kompilacji, ale w czasie odczytu wartość Serial.available() nadal dobija do 63, kilka powtórzeń pętli z tą wartością i potem sukcesywnie w dół o jeden (bo odczytuję po jednym bajcie na pętlę). Czyli w praktyce, jakby nic to nie wnosiło do arduino. Dalej ucina dane.
Zmiana baudrate-u nic nie pomaga, ewentualnie zamiast odczytanych 67 bajtów jest ich 64.
 
Odpowiedź
#6
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
Działa! Dzięki!
Grzebałem oczywiście nie w tym pliku. Przecież chodziło mi o hardware-owy interfejs.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości