przesył danych po rs'ie

Witam.

Zrobiłem urządzonko na Atmedze8535 do którego parametry pracy przesyłam za pomocą rs'a. Danych tych jest ok 20 bajtów. Stąd moje pytanie w jak kontrolować poprawny przesył danych?

Po przyjściu pierwszej danej zapisywana jest w pamięci i inkrementowany jest rejestr pełniący funkcje licznika. Gdy przyjdą wszystkie dane to licznik ten jest zerowany, dodatkowo po przyjściu 1 danej włączam timer, gdy przepełni się i nie przyjdzie następna dana to cały pakiet danych jest pomijany. to od strony uC.

Natomiast program komputerowy po każdym wysłanym bajcie czeka na dane zwrotne wysłane przez uC jeśli zgadzają się to wysyłany jest następny bajt, jeśli natomiast nie to transmisja jest przerywana.

Ja to rozwiązałem tak i nie wiem czy jest to poprawne, a zależy mi na poprawnej transmisji.

Proszę o pomoc i pozdrawiam. Goju.

Reply to
Goju
Loading thread data ...

Najlepiej zobaczyc jak to sie robi np. w ZModemie itp.

Skad wiesz ktora dana jest pierwsza? Musisz rozpatrzec jak pracuje urzadzenie po kilku godzinach pracy, a nie czy przesle pierwszy rozkaz.

Proponuje timeout (solidny) - brak danych np. minute - co by nie przyszlo traktowane jest jako poczatek.

Widze ze masz timeout - ok - pomijajac pakiet wyzeruj licznik bajtow.

Wysylanie echa to nie najlepszy pomysl. Nie bardzo kontrolujesz co jest grane jesli w przesylanych danych bedzie kilka razy ten sam bajt. Lepiej odsylac np. licznik. No i co to znaczy transmisja jest przerywana? Przeciez pewnie chcialbys by po bledzie trznsmisja mogla byc wznowiona bez resetowania. Jak bardzo ci zalezy na pewnosci dodaj do kazdego pakietu sume kontrolna (prosciutkie - to tylko 20 bajtow danych), i wysylaj potwierdzenie (ACK lub NAK) po kazdym pakiecie. No i oczywiscie timeout od strony PC tez by sie przydal. No i numerowanie pakietow i potwierdzen - wystarczy '1-bitowy licznik', o ile nie zakladasz kolejkowania pakietow gdzies 'w sieci' (np. w modemach).

Dobrze jest tez jakos zakodowac dane, tak by poczatek pakietu mozna bylo znalezc w dowolnym ciagu przesylanych bajtow.

Krzysiek Rudnik

Reply to
Krzysztof Rudnik

Ja zrobiłem coś a'la uproszczony modbus. Ramka wyglada tak:

:X dd dd dd dd CC

: - start transmisji X - komenda dd dd dd dd - 4 bajty danych hex CC - suma kontrolna poprzednich znaków

Proste i skuteczne. Pewnie, że są lepsze sposoby ale ten mi działa znakomicie.

Pozdrawiam PC

Reply to
Pablo C

Ja również stosuje takie sztuczki. Grunt w transmisji strumieniowej (jaką jest RS232) jest znak odddzialający i mówiący "tu zaczyna się ramka danych". Problem z timeoutami jest dośc trudny w rozwiązaniu na zwykłym PC i nie polecam - 100x lepiej jest przy tak małej ilości danych (20 bajtów to jest nic) na poświęcenie troche czasu i wysłanie ramki w hex'ach albo innym pomyśle kodowania bajt->2bajty. No i CRC to podstawa dyskusji o kontroli błędów. Projektuje własnie protokół i rozwiązuje na bierząco takie sprawy. Transmisja "2-bajtowa" okazała się jedynym sensownym sposobem do realizacji w sposób szybki i wygodny bez timeoutów.

Reply to
Sebastian Bialy

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.