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

[atmega+raspberryPI][C++] - Używanie typu zmiennej char w 32 bitowym systemie

crashbit 12 Sie 2013 22:16 1827 7
  • #1 12622299
    crashbit
    Poziom 15  
    Witam.
    Można pomyśleć że nie właściwy dział. Napisałem tu ponieważ myślę że osoby piszące programy na mikrokontrolery lepiej zrozumieją problem.
    Chce połączyć Raspberry PI (dla nie wtajemniczonych mini komputer na ARMie i pod kontrolą dedykowanego linuxa) po TWI z paroma atmegami.
    Mój problem to użycie zmiennej char w standardowym systemie operacyjnym.
    W atmedze używam char (większość rejestrów 8 bitów) z wygody i ze względu na pamięć i wszystko działa. Gdy zacząłem jednak pisać program w "standardowym" C++ na zwykłym kompilatorze pojawiła się niespodzianka. Już ją przedstawiam z użyciem poniższego kodu:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    no i mój wyniki dla wartości na przykład a=2 i b=4 to c=f i (int)c=102.
    Czy w takim razie mogę w jakiś sposób używać typu char w "standardowym" systemie?
    Próbowałem z uint8_t wynik taki sam.
    Z góry dziękuję za pomoc.

    P.S. mam nadzieje że nikt nie zje mnie za to że to właściwie nie o mikroprocki chodzi. Po prostu ludzie pracujący w 32bitowych systemach nie rozumieją użycia zmiennych mniejszych niż int.
  • #2 12622653
    krru
    Poziom 33  
    Nie, akurat to Ty masz złe przyzwyczajenia z dziwnego 8-bitowego systemu. Czy na Atmedze też używałeś C++? Tam jest przeciążanie operatorów i operator wyprowadzania (<<) w wersji dla char traktuje argument (zgodnie z nazwą) jako znak. W dwóch przypadkach cout << c; i cout << (int)c; w rzeczywistości wołane są dwie zupełnie różne funkcje.
    Zwykle typ int to jest najszybciej działający typ na danym komputerze. Operowanie na liczbach 8-bitowych w 32 bitowym systemie zwykle prowadzi do zmniejszenia wydajności.
  • #3 12622757
    Konto nie istnieje
    Konto nie istnieje  
  • #4 12622791
    piotrva
    VIP Zasłużony dla elektroda
    _marek napisał:
    Coś mi się wydaje że zmienne które wprowadzasz są w tym wypadku traktowane jako ascii.

    I dobrze Ci się wydaje.
    Jeśli zrobisz
    
    char c;
    cin >> c;
    

    I w konsoli wpiszesz 123, to w rzeczywistości do zmiennej c trafi '1', czyli kod ascii znaku 1.
    A wszystko zależy też w jakim formacie NADAJESZ dane z procesora.
    Bo można nadawać albo w ASCII i potem konwertować pobrany ciąg znaków na liczbę (tu najwydajniejsze jest kodowanie heksadecymalne, jeśli o przepustowość chodzi). (czyli dostajesz z uC np. "134" i potem robisz konwersję w odpowiedni sposób na liczbę, np. int)
    Albo nadawać z uC dane w formie binarnej, czyli np.:
    
    uint8_t a=123;
    uart_putc(a);
    

    Ogólnie pokaż nam obie strony komunikacji - wtedy doradzimy co i gdzie zmienić, żeby działało jak chcesz.
  • #5 12623211
    BlueDraco
    Specjalista - Mikrokontrolery
    Jeżeli a jest typu char to cin >> a czyta znak ze strumienia wejściowego. Kody znaków '2' i '4' to dziesiętnie 50 i 52, czyli wynik otrzymujesz poprawny. Twój problem nie wynika z długości typów, a z działania operatora >> w języku C++, w którym zapewne nie programowałeś ATmegi. Użycie typu int z cin >> x spowoduje skanowanie liczby ze strumienia wejściowego, ale nie dlatego, że int ma 32 bity a char 8, a dlatego, że typ danej użytej po prawej stronie >> implikuje sposób skanowania - dla char będzie to odpowiednik formatu "%1c" w języku C, a dla int - "%d".
  • #7 12629510
    crashbit
    Poziom 15  
    _marek napisał:
    Coś mi się wydaje że zmienne które wprowadzasz są w tym wypadku traktowane jako ascii.

    Tak to się domyślam :)
    piotrva napisał:
    Ogólnie pokaż nam obie strony komunikacji - wtedy doradzimy co i gdzie zmienić, żeby działało jak chcesz.

    Tu już nawet nie chodzi o samą komunikacje. Chodzi o sam ten fragment kodu że nie działa...
    BlueDraco napisał:
    Jeżeli a jest typu char to cin >> a czyta znak ze strumienia wejściowego. Kody znaków '2' i '4' to dziesiętnie 50 i 52, czyli wynik otrzymujesz poprawny. Twój problem nie wynika z długości typów, a z działania operatora >> w języku C++, w którym zapewne nie programowałeś ATmegi. Użycie typu int z cin >> x spowoduje skanowanie liczby ze strumienia wejściowego, ale nie dlatego, że int ma 32 bity a char 8, a dlatego, że typ danej użytej po prawej stronie >> implikuje sposób skanowania - dla char będzie to odpowiednik formatu "%1c" w języku C, a dla int - "%d".

    Atmege jak najbardziej programowałem w C++ tylko tam nie korzystam z "cin" w takim razie jak skanować? Jeśli w kodzie programu poprostu zapiszę a=2 b=4 i sume wyświetlę w formie
    Kod: text
    Zaloguj się, aby zobaczyć kod
    to wynik jest ok. Jak zrobić bym mógł skanować do char.
    Albo inaczej. Jest jakaś szansa na zmienną 8 bitową nie char, czy muszę wymyślić coś by to wszystko pracowało na INT-ach?
  • #8 12630381
    BlueDraco
    Specjalista - Mikrokontrolery
    Skanuj do int, a potem podstaw ten int pod char (raczej unsigned w obu przypadkach).
REKLAMA