Konvertera en CHAR till Hex?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
danielr112
Inlägg: 8092
Blev medlem: 18 januari 2009, 00:48:24
Ort: Alvesta, Småland

Konvertera en CHAR till Hex?

Inlägg av danielr112 »

Detta blir nog lite luddigt men ska försöka förklara

ROMet på en DS18S20 är ju 8 bytes. När man tittar på dem på datorn brukar man se dem i HEX form?

När man läser ur läser jag ur dem som en char åt gången men vill visa varje char fast från hex?

hmm detta blir nog svårt att förklara men försöker göra det bildligt.

När jag kollar i vanliga datorn med digitemp så läses dess rom ut som 16 bokstäver. dvs 8*HEX?

Hmm detta blir inte alls bra. men hoppas att någon förstår. Jag vill helt enkelt kunna ta de 8 bytesen och visa på en display så man ser de i samma format som jag ser dem på datorn.
Någon som har typs på vad jag ska börja?

Jag kör med MikroC och PIC16F690.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Re: Konvertera en CHAR till Hex?

Inlägg av cyr »

Du vill konvertera varje byte du läser ut till motsvarande två hexadecimala siffror i ASCII?

Om du inte vill blanda in några C-libs som tar mycket plats så gör typ:

Kod: Markera allt

char text[2];
unsigned char byte;

text[1] = byte>>4; // Plocka ut fyra högsta bitarna
text[0] = byte&0xf; // Plocka ut fyra lägsta bitarna

if(text[0] > 9) text[0] += 'A'; // A .. F
else text[0] += '0'; // 0 .. 9

if(text[1] > 9) text[1] += 'A'; // A .. F
else text[1] += '0'; // 0 .. 9

Otestad kod är väl bäst att säga, kanske missat nåt.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Konvertera en CHAR till Hex?

Inlägg av Icecap »

Att skriva ut en byte till en sträng i C är enkelt, likaså om den sträng ska vara hexadecimal.

sprint("%02Xh", Value);
skriver ut värdet i Value med 2 platser (fylls på med nollor om det behövs) och ett 'h' efter. Är innehållet i Value alltså 123 decimalt (= 7Bh) kommer det att bli "7Bh" ut. Vill du skippa 'h' är det bara att låta bli att skriva det osv.
danielr112
Inlägg: 8092
Blev medlem: 18 januari 2009, 00:48:24
Ort: Alvesta, Småland

Re: Konvertera en CHAR till Hex?

Inlägg av danielr112 »

Tack båda!

Vet att jag gjort det innan men nu i värsta förkylningen så vet jag inte vart jag förlagt det...

sprintf skippar jag helst då jag har för mig att den tar ganska mycke plats.

Tack grabbar!
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Konvertera en CHAR till Hex?

Inlägg av Icecap »

Ganska enkelt också:
char X;
X = Value >> 4;
X += '0';
if(X>'9') X += ('A'-'9');
// Nu är X högsta siffran att skrivas ut
X = Value & 0x0F;
X += '0';
if(X>'9') X += ('A'-'9');
// Nu är X den lägsta siffran att skriva ut
danielr112
Inlägg: 8092
Blev medlem: 18 januari 2009, 00:48:24
Ort: Alvesta, Småland

Re: Konvertera en CHAR till Hex?

Inlägg av danielr112 »

Hmm

lite kod:

Kod: Markera allt

char char2hex(unsigned char n) {
     char text2[2];
     text2[1] = n>>4; // Plocka ut fyra högsta bitarna
     text2[0] = n&0xf; // Plocka ut fyra lägsta bitarna
     if(text2[0] > 9) text2[0] += 'A'; // A .. F
     else text2[0] += '0'; // 0 .. 9
     if(text2[1] > 9) text2[1] += 'A'; // A .. F
     else text2[1] += '0'; // 0 .. 9
     return *text2;
}
Och sedan kör jag:

Kod: Markera allt

    for(i=0; i<8; i++) {
char text2[2]; //Ligger längst upp givetvis.

          *text2 = char2hex(rom[i]);
          Lcd_Chr_Cp(text2[1]);
          Lcd_Chr_Cp(text2[0]);
    }
Men text2[1] har bara skräptecken när den returneras. Kör jag och printar tecknen i proceduren funkar det.

Vad har jag missat?
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Re: Konvertera en CHAR till Hex?

Inlägg av thepirateboy »

Testa char2hex(unsigned char n, unsigned char *text2)
och skippa i att returnera något.

Anropa funktionen med char2hex(rom, text2);
danielr112
Inlägg: 8092
Blev medlem: 18 januari 2009, 00:48:24
Ort: Alvesta, Småland

Re: Konvertera en CHAR till Hex?

Inlägg av danielr112 »

Känns lite som en fulhacklösning.
Funkar gör det dock. Koden ser ut som här då:

Kod: Markera allt

.
.
.
char text2[2];

char char2hex(unsigned char n,char text2[2]) {
     text2[1] = n>>4; // Plocka ut fyra högsta bitarna
     text2[0] = n&0xf; // Plocka ut fyra lägsta bitarna
     if(text2[0] > 9) text2[0] += 'A'; // A .. F
     else text2[0] += '0'; // 0 .. 9
     if(text2[1] > 9) text2[1] += 'A'; // A .. F
     else text2[1] += '0'; // 0 .. 9
}
void main() {
.
.
.
char2hex(rom[i],text2);
Lcd_Chr_Cp(text2[1]);
Lcd_Chr_Cp(text2[0]);
.
.

Användarvisningsbild
mri
Inlägg: 1165
Blev medlem: 15 mars 2007, 13:20:50
Ort: Jakobstad, Finland
Kontakt:

Re: Konvertera en CHAR till Hex?

Inlägg av mri »

Det är ingen fulhacklösning. Du måste göra så där i C. Orsaken är att det inte går att returnera innehållet i ett fält ("array" på engelska) från en funktion.
(Kan också tilläggas att det inte är innehållet i text2[] fältet som skickas till funktionen, utan endast fältets adress.)

Jag hade snyggat till koden lite:

Kod: Markera allt

void char2hex(unsigned char n, char text2[2]) 
{
     text2[1] = n>>4; // Plocka ut fyra högsta bitarna
     text2[0] = n&0xf; // Plocka ut fyra lägsta bitarna
     if(text2[0] > 9) text2[0] += 'A'; // A .. F
     else text2[0] += '0'; // 0 .. 9
     if(text2[1] > 9) text2[1] += 'A'; // A .. F
     else text2[1] += '0'; // 0 .. 9
}

void main() 
{
    char text2[2];
.
.
    char2hex(rom[i], text2);
    Lcd_Chr_Cp(text2[1]);
    Lcd_Chr_Cp(text2[0]);
.
.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Re: Konvertera en CHAR till Hex?

Inlägg av cyr »

Går också att göra såhär:

Kod: Markera allt

char* char2hex(unsigned char n) {
// OBS: static, annars ligger datan på stacken och kan inte användas efter return!
     static char text[2];
     text2[1] = n>>4; // Plocka ut fyra högsta bitarna
     text2[0] = n&0xf; // Plocka ut fyra lägsta bitarna
     if(text2[0] > 9) text2[0] += 'A'; // A .. F
     else text2[0] += '0'; // 0 .. 9
     if(text2[1] > 9) text2[1] += 'A'; // A .. F
     else text2[1] += '0'; // 0 .. 9

     return text;
}
Anropas såhär:

Kod: Markera allt

char *text;

text = char2hex(0x37);

Lcd_Chr_Cp(text2[1]);
Lcd_Chr_Cp(text2[0]);
Ännu snyggare om man gör text[] till tre byte, byter plats på [1] och [0] och sätter [2] till '\0'.

Så kan man använda Lcd_Putstr(text); eller Lcd_Putstr(char2hex(0x55)); om man råkar ha en snarlik funktion...
Användarvisningsbild
mri
Inlägg: 1165
Blev medlem: 15 mars 2007, 13:20:50
Ort: Jakobstad, Finland
Kontakt:

Re: Konvertera en CHAR till Hex?

Inlägg av mri »

Jo, går att använda en statisk buffer men det rekomenderas verkligen inte!

Kom just på att följade metod brukar presenteras som ett "coolt" sätt i diverse C böcker. Genererar antagligen minst kod också, om nu kompilatorn optimerar ihop strängarna:

Kod: Markera allt

Lcd_Chr_Cp("0123456789ABCDEF"[byte >> 4]);
Lcd_Chr_Cp("0123456789ABCDEF"[byte & 0xF]);
danielr112
Inlägg: 8092
Blev medlem: 18 januari 2009, 00:48:24
Ort: Alvesta, Småland

Re: Konvertera en CHAR till Hex?

Inlägg av danielr112 »

cyr: Funkar tyvär inte och ger konstiga saker ut.

Jag kör MikroC Pro om det var så att du kanske testkörde det med annat program.

edit:

Mri: Ditt sista där funkar inte i MikroC rakt av. Tror också jag nöjer mig me de andre. det räcker för att uppnå mitt mål.

edit igen: Missade ditt första inlägg också. Ok länge sedan jag satt med C så har inte koll på return får jag erkänna.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Konvertera en CHAR till Hex?

Inlägg av jesse »

Blir det där verkligen rätt?

if(text2[1] > 9) text2[1] += 'A'; // A .. F

antag att text2[1] = 11 , dvs 0xB

11+'A' får jag till 'L', inte till 'B'

så du får väl subtrahera 10 för att få rätt bokstav.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Re: Konvertera en CHAR till Hex?

Inlägg av cyr »

:doh:

Helt rätt jesse, tankefel av mig.

if(text2[1] > 9) text2[1] += ('A' - 10); // A .. F

Måste det vara.
Användarvisningsbild
mri
Inlägg: 1165
Blev medlem: 15 mars 2007, 13:20:50
Ort: Jakobstad, Finland
Kontakt:

Re: Konvertera en CHAR till Hex?

Inlägg av mri »

En liten detalj till om det här ämnet. Man får passa sig när man högerskiftar för att plocka ut den övre nibblen. T.ex. byte >> 4 är problematiskt om 'byte' är deklarerad som 'char'. Detta eftersom "C" inte specificer om char är signed eller unsigned. Kompilatorn kan ha vilkendera som default. Dvs. om char är signed och variabeln 'char byte' har värdet 0xff, då är byte>>4 lika med 0xff (-1), när man kaske förväntade sig 0x0f (15).

Anta aldrig något om char, utan ange utryckligen om den skall vara 'unsigned char' eller 'signed char' om du tänkt använda den till beräkningar och dyligt.
Skriv svar