Wpis z mikrobloga

Mirki z #arduino

Ktoś komunikował się po serialu z komputera za pomocą np #python?

Mam problem, mianowicie każdy read() i write() z arduino zaśmieca mi mocno przekaz.

Mam baud na 9600 i przesyłam spore ilości danych (do 32KB)

Tworzę EEPROM programmer i mam problem, bo dodanie głupiego przesłania 1 bita w te i spowrotem zanim zaczne wysyłać plik powoduje mi strasznie zanieczyszczenia w reszcie.

Muszę używać flush, delay(300) i ogólnie czyścić serial resetinputbuffer() resetoutputbuffer() po stronie Pytona

Ktoś ma pomysł jak fajnie zaprogramować połączenie by nie wywalało błędów? Mój kod działa, ale dodanie np. wysyłania instrukcji czy wysyłanie czegoś "na żywo" zawsze kończy się problemami..

Np. nie jestem pewien czy Arduino Nano jest w stanie obsłużyć 32KB array bytów, a taki dokładnie przesyłam i zastanawiam się czy to się nie skończy jakimś dziwnym problemem..

#programowanie #elektronika
  • 8
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Wydaje mi się że programy nie bardzo wiedzą kiedy mają skoczyć czytać, dobrze jest wysłać jakiś znak kontrolny np. \0 który będzie oznaczać koniec streamu. Do tego jeszcze polecam dodać sekwencje oznaczającą początek transmisji + "crc" inaczej nigdy się nie dowiesz czy dane są poprawne, bo słabe zasilanie może przekręcić transmisje.
  • Odpowiedz
@sorek: rozumiem że pierwszy bajt to ilość 256 bajtowych paczek przesyłanych do i z arduino? Więc wiesz kiedy się transmisja kończy, wystarczy dodać jakiś magic number na początku, np kilka literek, oraz sumę kontrolną na końcu, do testów może to być zwykła suma, ale przynajmniej crc16 jest konieczne przy binarnej transmisji. No i koniecznie potem jest zrobić timeout na odczycie danych.

Kolejna sprawa to nie stosuj rozszeżenia gnu do tablic
  • Odpowiedz
@lionbest: @SirKir: ok, ale nie do końca rozumiem jakbym miał to zaprogramować.

Głównie chodzi o to, że to są faktycznie przesyłane bajty i problemem jest tu oczywiście to, że nie do końca chcę by te rzeczy się pomieszały.

@sirkir jakie bajtowe oznaczenie ma \0? Bo arduino widzi tylko wartości od 0 do 255 bo tak je odbieram
  • Odpowiedz
@lionbest: no najpierw wysyłasz np znaki 'e' 'p' 'r' 'o' 'm' no i jak je odbierasz i sprawdzasz czy faktycznie takie znaki przyszły jak nie to sprawdzasz od początku. Potem każdy wysłany/odebrany bajt z paczki sumujesz do zmiennej typu byte i wypisujesz/sprawdzasz ja na końcu.

No i najważniejsze wywal ta tablice do zmiennej globalnej i nie używaj sizeof skoro ilość danych masz już w zmiennej.
  • Odpowiedz
@lionbest: zrobiłem nieco inaczej bez sprawdzania CRC i działa:
Python
def write():
ser.write((fileSize).to_bytes(1, 'big'))
print(256*int.from
  • Odpowiedz