Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATmega2560][Arduino] - Komunikacja po RS232 za pośrednictwem Arduino

matecki 29 Maj 2013 18:06 1311 0
  • #1 29 Maj 2013 18:06
    matecki
    Poziom 12  

    Witam
    Przejdę od razu do opisu problemu.
    Mam dwa urządzenia. Jedno Nadawca wysyła dane po RS232 drugi Odbiorca drukarka termiczna Epson TM-T88 (transmisja ASCII). Sposób komunikacji rozgryzłem przy użyciu analizatora stanów logicznych jest to również transmisja ASCII z kilkoma dodanymi elementami. Chcę ją przetłumaczyć tak aby dane drukować na Epsonie oraz zapisać je na karcie SD przez Arduino. Komunikacja wygląda następująco(bajty w zapisie HEX):
    N - Nadawca, O - Odbiorca:

    N - 05 - początek danawania
    O - 20 - potwierdzenie(gotowość do odbioru)
    N - 02 - początek ramki danych
    N - ...dane... - jedna lub dwie linie wydruku na raz
    N - 0A
    N - 0D - te dwa bajty oznaczają przejście do kolejnej linii
    N - 05 - koniec ramki danych
    O - XOR - suma kontrolna (XOR z danych) przesyłana na dwóch bajtach
    N - 03 - koniec sesji

    Ilość danych w jednej ramce jest zmienna i może wynosić nawet ponad 80 bajtów co przepełnia bufor wejściowy portu com1. W linii RS232 jest wykorzystany sygnał CTS (Clear To Send) ale sądzę że ze względu na to iż Nadawca komunikował się oryginalnie z bardzo starą igłową drukarką, która potrzebowała więcej czasu na przemielenie danych niż moje ATmega więc wystawiam go cały w stan wysoki czyli "gotowy do odbioru".
    Kod programu w Arduino:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Jest to mój pierwszy "poważny" projekt z Arduino. Mam jeszcze jedną wersję programu która działa ale drukarka nie drukuje płynnie ponieważ są powprowadzane opóźnienia w programie i kompletnie nie rozumiem dlaczego tamten program działa :| .
    Co do tego kodu to również działa ale drukarka drukuje każdą linię dwa razy. Dzieje się tak ponieważ dodałem zmienną "spr" tak aby odebrać więcej niż 64 bajty danych. Nadawca dwa razy wysyła jedną ramkę która "zajmuje" dwie linijki wydruku i w polu danych dwa razy pojawia się komenda przejścia do następnej linii a samo pole danych ma ponad 80 bajtów. Bez tej zmiennej wydruk zatrzymuje się właśnie na tej długiej ramce tzn. drukarka drukuje to co jest przed tą ramką i później wszystko staje. W obecnej sytuacji długa ramka jest drukowana poprawnie ale wszystkie inne drukowane są dwa razy.
    Generalnie nie bardzo wiem czy dobrze rozumiem jak działa sekwencja wykonywania programu więc mocno skomentowałem program i proszę aby ktoś wyprowadził mnie z błędnego myślenia. Generalnie kod powstawał metodą prób i błędów przez 2 tygodnie. Zdaje sobie sprawę, że kod jest bardzo amatorski ale nie mam się na czym wzorować ,do wszystkiego dochodzę sam. Utknąłem w martwym punkcie i potrzebuję jakiegoś impulsu aby iść dalej. Nie chcę używać kodu który działa ale go nie rozumiem(chociaż sam go napisałem :| ).
    Proszę o pomoc.

    0 0
  Szukaj w 5mln produktów