uart i hex

Dec 27, 2004 23 Replies

Jak napisaæ w AVR-GCC funkcje dzia³aj±c± identycznie jak: printf("%02X", n); ?? Wywo³anie wygl±da³o by np. tak: uart_putchar_hex(n);



  1. Pomyśl jak zamienić bajt na 2 znaki hex: - rozdziel na starszą ((n >> 4) & 0x0f) i młodszą połówkę (n & 0x0f) - mając dwie liczby z zakresu 0..15 przekształć każdą z nich na znak szestnastkowy
  2. Wyślij te znaki funkcją typu uart_putchar (ch)

A dlaczego nie chcesz normalnie użyć printf, wcześniej się doczepiając do jego mechanizmu wywołaniem fdevopen?

Tyle, ¿e mi chodzi o takie co¶, ¿eby z np. 26 zrobiæ 1A (?), a potem wystawiæ znakowo 1 i A.

a co chcesz "robić" ? Przecież wewnętrznie i tak już jest.

uchar a, b;

a = 0x26; // na przykład b = a & 0x0F; uart_putchar( b + (b < 10) ? '0' : 'A' ); b = (a & 0xF0) >> 4; uart_putchar( b + (b < 10) ? '0' : 'A' );

ok?

Waldek

To maskowanie (a & 0xF0) jest zbędne. Wystarczy b=a>>4;

fuckt. Ale wygląda ładniej ;-) No i coniektóre kompilatory (nie wiem, czy GCC nie jest takim świnią) propagują MSB przy shifcie i już masz kłopot. Z moją wersją zresztą też, więc lepiej: b = (a >> 4) & 0x0F;

Waldek

MSB ? chodzi ci o najstarszy bit w bajcie ? Jeśli masz liczbę bez znaku to na najstarszy bit zawsze jest wpisywane 0, a jeśli ze znakiem to powielany jest bit znaku. W przykładzie który dałeś masz liczbę bez znaku więc zapis "b=a>>4;" jest w pełni wystarczający.

U¿ytkownik "Waldemar Krzok" snipped-for-privacy@charite.de napisa³ w wiadomo¶ci news: snipped-for-privacy@charite.de...

Propagacja MSB chyba zalezy od signed/unsigned a nie od kompilatora.

Krzysiek Rudnik

teoretycznie masz rację, ale już kiedyś dostałem kurwicy jąder, bo kompilator o tym nie wiedział ;-) Strzyżonego pan bóg strzyże...

Waldek

tak być powinno. Ale jak już pisałem, miałem kiedyś kompilator, który uparł się, że bedzie robił shifta na signed, choć wsio było unsigned. No i miałem problem, a koledzy nauczyli się trochę polskiej łaciny.

Waldek

Uwazaj, bo jak swierdzi ze typ jest "signed", to moze czasem z przodu dopelnic 1111

J.

Wytłumacz mi jak kompilator zmienną typu unsigned char może potraktować jako liczbę ze znakiem.

Mozesz zapomniec dopusac unsigned. Moze miec blad. Albo upierdliwie realizowac standard - byl tu jakis przyklad jak to GCC konwertowal na 16 bit ..

J.

^^^^^^^^^^^^^^^^^^^^^^^ To co, unsigned char ma zakres 0...127??

Pozdrawiam

Mogę się założyć, że ilość zmiennych ze znakiem jest małym procentem wszystkich zmiennych w programach do systemów terujących/osadzonych/itp. Więc prędzej ktoś z rozpędu dopisze unsigned tam gdzie go być nie powinno.

Chcesz przez to powiedzieć, że w wyniku tej konwersji wynik operacji był nieprawidłowy (tzn liczba została potraktowana jakby miała znak, choć go mieć nie powinna) ? Ciekawe, bo na stronie

formatting link
nic o tym nie ma.

Przeczytaj proszę jescze raz parę postów powyżej. To co napisałem dotyczyło operacji przesuwania w prawo liczby bez znaku (x>>y).

No, tak. Niedoczytałem, że chodzi o 0 wpisywane w wyniku przesuwania.

Serdeczne

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required