logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega8 - transmisja rs232

misiek1994 01 Paź 2011 15:23 1630 5
REKLAMA
  • #1 9982066
    misiek1994
    Poziom 17  
    Witam! Napisałem na szybko kod odbierający po 8 znaków z komputera.
    Pierwszy znak "?" jest znakiem startu. Następne 7 to dwie liczby (trzy i dwucyfrowa). Mikrokontroler nie odczytuje (poprawnie, bądź wcale) ostatniego znaku, wcześniejsze są ok. Nie wiem, gdzie mogłem się machnąć w tak prostym programie.
    Ze strony komputera korzystam z terminal by br@y.

    Poniżej kod (może nie działać, gdyż wyciąłem większość, która nie odnosi się do rs232).

    Kod: text
    Zaloguj się, aby zobaczyć kod
    [/code]
  • REKLAMA
  • #2 9982877
    GSM
    Poziom 25  
    Witam,

    Czy te mnożniki w funkcji set_values są poprawnie? Na pewno 100, 100, 1 a nie 100, 10, 1 ?
    I co to znaczy:
    misiek1994 napisał:
    Mikrokontroler nie odczytuje (poprawnie, bądź wcale) ostatniego znaku

    Echo dobre wraca? Czy liczbę źle konwertuje?
    Mało informacji podajesz.

    Pozdrawiam,
    GSM
  • REKLAMA
  • #3 9983448
    misiek1994
    Poziom 17  
    Oczywiście miało być 100,10,1. Dzięki za poprawkę, ale to i tak nie ma żadnego wpływu na moje echo, które nie zachacza o transmisję.
    Generalnie jedna ramka ma:
    1) pierwszy znak rozpoczynający odbiór '?'
    2) znak 1 i 5 są znakami + lub - w zależności, czy liczba jest ujemna, czy dodatnia.
    3) znaki 2,3,4 to liczba 3-cyfrowa, znaki 6,7 to liczba 2-cyfrowa

    Po wysłaniu w transmiterze tekstu ascii: "?+094-32" echo zwraca "?+094-3d".
    Nie wiem, czy programik dobrze koduje ostatni znak (czy nie dodaje/odejmuje czegoś na końcu).
    Pzdr misiek
  • REKLAMA
  • Pomocny post
    #4 9984111
    krru
    Poziom 33  
    Dlaczego tablica ascii ma tylko 6 pozycji? Potrzebujesz 7. Jawnie wychodzisz poza tablicę (w kodzie wystepuje ascii[6]).

    I taka uwaga na przyszłość. W funkcji set_values wysyłasz dane serialem. Procedura USART_Transmit czeka aktywnie na wysłanie - trwa dość długo. Wywołanie jej w procedurze obsługi przerwania z odbiornika powoduje za długie wykonanie tej procedury - trwa tyle co wysłanie 7 znaków, więc odbiornik jest zablokowany. Robisz to po odebraniu ostatniego znaku, więc to nie przeszkadza, o ile następne ustawienie nie zostanie wysłane zaraz po aktualnym. Sam się wiele raz naciąłem na wysyłaniu znaków serialem w procedurze odbioru i potem mi gubiło co któryś znak.
  • REKLAMA
  • #5 9985515
    misiek1994
    Poziom 17  
    No nieźle, na to nie wpadłem, że deklaracja jest od 1 nie od zera. Trochę niekonsekwentny ten c++. Ale jest nauczka, żeby czytać książki i datasheet, a nie robić wszystkiego na żywca.

    Generalnie to echo jest tylko w celu sprawdzenia transmisji (czemu mi nie działało). W planach jest transmisja jednokierunkowa przy udziale modułów bezprzewodowych 433mhz. Aczkolwiek dzięki serdeczne za tą uwagę. Na pewno zapamiętam.

    Pzdr misiek
  • #6 9985609
    mirekk36
    Poziom 42  
    misiek1994 napisał:
    Trochę niekonsekwentny ten c++.


    Po pierwsze to nie C++ tylko C ;) ... i nie język jest niekonsekwentny tylko programista, który jak sam dalej stwierdza (słusznie zresztą)


    misiek1994 napisał:
    Ale jest nauczka, żeby czytać książki i datasheet, a nie robić wszystkiego na żywca.


    Jeśli tak będzie dalej robił to i znikną takie podstawowe problemy i własna konsekwencja wzrośnie ;)
REKLAMA