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.

Wysyłanie na Serial ArduinoMega

Skiper57 17 Sie 2018 18:28 219 11
  • #1 17 Sie 2018 18:28
    Skiper57
    Poziom 1  

    Witam.
    Mam następujący problem, wysyłam dane HEX przez port serial na Arduino Mega.
    I wszystko działa pięknie, tylko nie wiem dlaczego obcina mi zera.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    wyniki z monitora portu

    FF2F001
    FF2F001
    FF2F001

    obcioł po jednym zerze tam gdzie wartość jest $00
    i zero gdzie wartość jest $01.
    Dlaczego tak się dzieje ?

    Jendrek.

    Moderowany przez dondu:

    Wklejając kod programu używaj proszę znacznika SYNTAX.
    Składnia jest wtedy kolorowana i łatwo kod analizować, a dodatkowo posty są krótkie.
    Instrukcja: https://www.elektroda.pl/rtvforum/topic3300722.html

    Post poprawiłem.

    0 11
  • #2 17 Sie 2018 22:48
    pimpuk
    Poziom 22  

    Binary Hex
    0 - - - - - - 0
    1 - - - - - - 1
    10 - - - - - 2
    11 - - - - - 3
    100 - - - - 4
    101 - - - - 5
    110 - - - - 6
    111 - - - - 7
    1000 - - - -8
    1001 - - - -9
    1010 - - - -A
    1011 - - - -B
    1100 - - - -C
    1101 - - - -D
    1110 - - - -E
    1111 - - - -F

    To jest nibble. Jak starsza połówka jest 0x0, to jej nie ma, a jak jej nie ma, to po co ją wysyłać? Wystarczy młodszy półbajt.

    0
  • #3 18 Sie 2018 18:38
    Skiper57
    Poziom 1  

    Czyli w jaki sposób mam zapisać daną wartość żeby została wysłana przez serial jako pełny bajt, pomimo zawartości zer. Musze wysłać do urządzenia zewnętrznego którym steruję określony ciąg bajtów, zawierający również zera.

    Jendrek.

    0
  • #4 18 Sie 2018 20:43
    Mandeson
    Poziom 10  

    Na przykład tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 19 Sie 2018 01:05
    pimpuk
    Poziom 22  

    o tak na chłopski rozum. Jak chcesz wysłać 0001, to wysyłasz 1, a jak chcesz wysyłać 0000 0001, to też wyślesz 1.
    Wrzuć sobie maskę na odbiorniku.

    0
  • #6 19 Sie 2018 10:43
    Skiper57
    Poziom 1  

    OK. czyli wysłanie ciągu bajtów zawierających zera i zero przed cyfrą nie jest możliwe ? Chcę sterować urządzeniem zewnętrznym które musi otrzymać określony ciąg bajtów w pełnym wymiarze ( więc zera również), aby wykonać rozkaz.
    Czy to jedyny sposób zaproponowany przez Mandesona ?

    Jendrek.

    0
  • #7 19 Sie 2018 11:08
    Mandeson
    Poziom 10  

    Są dwie różne opcje. Albo wysyłasz dane tekstowe (przykład podesłany przeze mnie, zrozumiałe przez człowieka, ale to zajmuje więcej czasu i trudniej to odkodować w odbiorniku), albo dane binarne (w terminalu widać krzaczki, ale łatwo to odczytać w drugim Arduino). Jak odczytywane są dane w odbiorniku? Tekstowo, czy binarnie?

    0
  • #8 19 Sie 2018 13:52
    pimpuk
    Poziom 22  

    Skiper57 napisał:
    OK. czyli wysłanie ciągu bajtów zawierających zera i zero przed cyfrą nie jest możliwe ? Chcę sterować urządzeniem zewnętrznym które musi otrzymać określony ciąg bajtów w pełnym wymiarze ( więc zera również), aby wykonać rozkaz.
    Czy to jedyny sposób zaproponowany przez Mandesona ?

    Jendrek.


    Możesz pokazać kod, który steruje urządzeniem "ciągiem bajtów"?
    To, w jaki sposób przedstawiasz sobie liczbę na ekranie, nie jest istotne dla programu czy urządzenia cyfrowego.
    Jeśli wysyłasz powiedzmy liczbę 0xFF, to dziesiętnie będzie 255, binarnie 0b11111111, ósemkowo 377. Dla dziesiętnie 8, binarnie będzie 1000, ale dla 4, to będzie 100 a nie 0100. Dla twojego urządzenia to jest nie istotne, komputer pracuje na liczbach binarnych, przesyłając liczbę po UART, zawsze wysyłasz ciąg zer i jedynek, a to że na ekranie masz to przedstawione w inny sposób, to kwestia wyboru tego sposobu.
    Dobrze by było, jakbyś podał kod sterujący urządzeniem. Jeśli wyślesz 0x0F, to i tak wyślesz 0b1111. Jeżeli to ma ustawić port urządzenia odbiorczego to i tak ustawi go na 0b00001111.

    0
  • #9 19 Sie 2018 14:29
    Skiper57
    Poziom 1  

    Urządzenie zewnętrzne jest obiektem zamkniętym i nie mam żadnej ingerencji w jego funkcjonowanie. Dysponuje jedynie odpowiednimi instrukcjami, które wykona odpowiednią funkcję. Na przykład taki ciąg bajtów:
    0xA5, 0x68, 0x32, 0x01, 0x7B, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x02, 0xFF, 0x00, 0x00, 0x39, 0x39, 0x39, 0x00, 0xE9, 0x02, 0xAE;
    wykona mi określone zadanie.Nie mogę nic zmienić w ustawieniach tego urządzenia.
    Sprawdzałem na programach typu terminal i wysłanie takiego ciągu działa. Teraz musze to przenieść na AtMege.

    Jendrek.

    0
  • #10 20 Sie 2018 08:29
    Mandeson
    Poziom 10  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #11 20 Sie 2018 15:43
    pimpuk
    Poziom 22  

    No ale ten kod wyświetla nam na ekranie to, czego oczekuje autor.
    Z opisu wynika, że urządzenie sterowane jest ciągiem bajtów i czyli oczekuje czegoś zupełnie innego.
    Upraszczając, jeśli wyślę na port, na przykład liczbę 3, to port ustawiam na 0000011, tak samo gdy wyślę 0x03, lub 0x3.
    Dla, na przykład 19, port ustawię na 00010011, tak samo jak dla 0x13.
    Zauważyłeś, że bajt hexadecymalnie zapisywany jest z postaci dwóch półbajtów? Jeśli starszy jest 0x0, to ekran ci go nie wyświetla, ale starsza połówka portu i tak jest ustawiana na 0000.

    0
  • #12 20 Sie 2018 23:33
    Mandeson
    Poziom 10  

    Dalej nie wiadomo, czy autorowi chodzi o tekstowy czy binarny ciąg bajtów. Założyłem, że chodzi o ciąg tekstowy - wyświetlany w podesłanym przez autora programie. Jeśli chodzi o ciąg binarny, to w oryginalnym programie wystarczy zmienić typ "byte" na "char".

    0
  Szukaj w 5mln produktów