Printf de char en hexadécimal affiche un byte en 4 caractères ?

develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009 - 12 mars 2007 à 16:56
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009 - 14 mars 2007 à 09:04
Bonjour,

Le printf  de mon compilateur génère des erreures d'affichages, en effet je dipose de variables unsigned char que je voudrais affichées en héxadécimal (%X).

Donc je travaille avec les registres d'un microcontrolleur et comme il s'agit de registre
8 bits (1 byte), j'ai donc déclaré des unsigned char (1 byte) pour les afficher en hexa et ainsi connaitre les etats des registres. Mais quand je fais un printf j'affiche mon byte non pas en 2 caractèers mais bien 4?

code:
extern  xdata Byte volatile ide_status_register     _at_     address;
printf("ide_status_register : %X\n\r", ide_status_register);

affichage:
ide_status_register :  D803   //erreur 03

La valeur du regsitre est D8, remarquez la presence de deux caractères hexa aléatoires (03) qui gênent.

Alors qu'avec un int on a bel bien deux caractères hexadécimaux comme il se doit.
code:
int tstprntf1  = 45;
int tstprntf2  = 31;
printf("int 45: %X\n\r", tstprntf1);
printf("int 31: %X\n\r", tstprntf2);

affichage:
int 45:  2D
int 31:  1F

Comment pourrais je pallier ce genre de données supplementaires, car c'est très vite genant
dans des applications tel que lecture dans un secteur du disque dur.

Faut-il convertir les char en int puis afficher peut etre par des strings?

Merci
A voir également:

5 réponses

vdust Messages postés 43 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 14 mars 2007
13 mars 2007 à 18:43
Le symbole %X est utilisé pour convertir un entier en hexadécimal (tel que spécifié dans la page de man de la fonction printf). Donc lorsque tu fais printf ("%X", toto); avec toto un unsigned char, printf va lire 4 octets : celui de toto plus les 3 suivants ; ce qui conduit à ton "erreur" supposée. En fait, c'est tout à fait normal. En effet, le prototype de printf est
printf (const char *format, ...);
en d'autres termes, elle prend un nombre variable d'arguments, et ne connait pas a priori leur type... si ce n'est par l'intermédiaire des symboles présents dans la chaîne de format.
La bonne manière de procéder est donc de convertir explicitement ton unsigned char en int dans le printf :

printf("ide_status_register : %X\n\r", (int) ide_status_register);

-- Virtual Dust --
0
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
13 mars 2007 à 22:33
Salut,

Merci pour ces infos. Et justement j'y suis arrive en passant le unsigned char a un int puis j'affichais avec le printf le int et la il n'y a plus les deux caracteres parasites qui apparaissaient pour les chars.
C'est vrai que la conversion dans le printf sera mieux.

Mais bref le probleme d'origine n'est toujours pas resoud. Malgres
cette modif, la lecture des 512 bytes d'une adresse d'un secteur d'une carte
CompactFlash ne faite apparaitre que un byte sur deux de ce secteur. C'est comme ci la lecture
se fesait en 16 bits?

La librairie que j'utilise est en 8 bits
mais au niveau hardware je suis en 16 bits mais bien sur mon
microcontrolleur Atmel (AT89C51SNDC1) me permet de passer en mode 8
bits par configuration du registre AUXR.
Du cote de la carte CF, j'envoi une commande pour etre aussi en 8 bits :

Ide_set_feature(IDE_ENABLE_8_BIT_TRANSFERT);
Ide_send_command(ATA_CMD_SET_FEATURES);          /* Set Features */ 

Je
pense plutot qu'il s'agit d'un probleme de software mais sinon ce
serait du cote de la CompactFlash, le True Ide Mode qui ne s'active pas?

Sauriez vous m'aider ?

Merci
0
vdust Messages postés 43 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 14 mars 2007
14 mars 2007 à 01:00
Serait-il possible de voir le code complet chargé de lire ces fameux 512 octets ?
D'autre pars, je ne sais pas comment fonctionne cet fonction Ide_set_feature dans le cas présenté, mais mon intuition me laisse penser que la constante IDE_ENABLE_8_BIT_TRANFERT se contente d'autoriser les transferts dans ce mode, sans pour autant l'activer (le y aurait-il une constante du genre IDE_USE_8_BIT_TRANSFERT ?). Pour ce qui est de la lecture par bloc de 16 bits, cela doit être facile à vérifier, en récupérant les valeurs non pas dans des unsigned char, mais dans des unsigned short et d'afficher ces derniers.

-- VDust --
0
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
14 mars 2007 à 09:02
Salut Vdust,

En fait tu as déjà un aperçu de mon code sur ce topic, je peux aussi te l'envoyer.

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
14 mars 2007 à 09:04
0
Rejoignez-nous