2013-10-01 28 views
5

Programuję Arduino i próbuję uzyskać Serial.print() bajtów w formacie szesnastkowym "na mój sposób" (czytaj dalej, aby uzyskać więcej informacji).Jak "Serial.print()" "pełne" bajtów szesnastkowych?

Oznacza to, że za pomocą następującego kodu

byte byte1 = 0xA2; 
byte byte2 = 0x05; 
byte byte3 = 0x00; 

Serial.println(byte1, HEX); 
Serial.println(byte2, HEX); 
Serial.println(byte3, HEX); 

uzyskać następujące dane wyjściowe w Serial Monitor:

A2 
5 
0 

Jednak chciałbym wyjście następuje:

A2 
05 
00 

W słowach, chciałbym wydrukować "pełną" wartość szesnastkową, w tym 0 s (05 zamiast 0 i zamiast 0).

Jak mogę to zrobić?

+0

można wydrukować je na sznurku w odpowiednim formacie, a następnie wysłać ten ciąg przez port szeregowy? –

+0

@Retired Ninja - Co masz na myśli mówiąc "wydrukuj je na ciąg w odpowiednim formacie"? Jak mogę to zrobić? – Backo

+1

'sprintf (bufor,"% 02x ", liczba); Serial.println (bufor); ' –

Odpowiedz

5

Prosta metoda brute force jest napisać procedurę jak:

void p(char X) { 

    if (X < 16) {Serial.print("0");} 

    Serial.println(X, HEX); 

} 

iw kodzie głównym:

p(byte1); // etc. 
+0

Dzięki funkcji 'sprintf' (jak @Retired Ninja powiedział w poprzednim komentarzu) jest to bardziej proste ... dlaczego powinienem użyć twojego kodu? – Backo

+2

@ Backo, załaduj rozmiar modułu. To jest, ile kodu generuje "sprintf" dla twojego systemu wbudowanego? Jeśli twój szkic stanie się zbyt duży, będziesz musiał zrezygnować z luksusu. Ale dla małego szkicu wszystko, co działa, jest oczywiście dopuszczalne. – JackCColeman

0

Spróbuj tego:

//Converts the upper nibble of a binary value to a hexadecimal ASCII byte. 
//For example, btohexa_high(0xAE) will return 'A'. 
unsigned char btohexa_high(unsigned char b) 
{ 
    b >>= 4; 
    return (b>0x9u) ? b+'A'-10:b+'0'; 
} 


//Converts the lower nibble of a binary value to a hexadecimal ASCII byte. 
// For example, btohexa_low(0xAE) will return 'E'. 


unsigned char btohexa_low(unsigned char b) 
{ 
    b &= 0x0F; 
    return (b>9u) ? b+'A'-10:b+'0'; 
} 

I w kodzie głównym :

comand_mod=0xA1; //example variable 
Serial.print(btohexa_high(comand_mod)); 
Serial.print(btohexa_low(comand_mod)); 
1

Niestety - za mało reputacji do komentowania, ale stwierdzono, że poprzednia odpowiedź nie jest w pełni poprawna. Faktycznie, ładne światło sposobem kod powinien być:

void P (bajt X) {if (X ) {Serial.print ("0");} ...

podając kod:

void p(byte X) { 

    if (X < 10) {Serial.print("0");} 

    Serial.println(X, HEX); 

} 

aw głównego kodu:

p(byte1); // etc. 

nadzieję, że to pomaga

+1

'X <10'? 16 może, ale nie 10; –

+0

Uzgodniono, po prostu zmodyfikuj, aby przetestować <0x10 i gotowe :-) – izak

1

Używaj sprintf drukowania do bufora (dwa znaki na bajt zerowy + terminator):

byte byte1 = 0xA2; 
byte byte2 = 0x05; 
byte byte3 = 0x00; 
char s[7]; 
sprintf(s, "%02x\n%02x\n%02x", byte1, byte2, byte3); 
Serial.println(s); 

Dodano nowe linie pomiędzy dostać każdy na nowej linii. Informacje o '% 02x',% oznacza tutaj informacje o formatowaniu, 0 oznacza pad z 0, 2 oznacza pad pad do 2 znaków, a x oznacza to jako szesnastkowe.

Dla innych opcji formatowania zobaczyć http://linux.die.net/man/3/sprintf