Conversion de int en char

Fermé
meherTABARKA Messages postés 11 Date d'inscription mardi 6 mai 2014 Statut Membre Dernière intervention 8 mai 2014 - 6 mai 2014 à 16:04
meherTABARKA Messages postés 11 Date d'inscription mardi 6 mai 2014 Statut Membre Dernière intervention 8 mai 2014 - 8 mai 2014 à 15:38
Bonjour à tous
J'ai eu une fonction qui retourne des données de types uint8_t ( unsigned interger 8 bits) je veux envoyer ces données via le port série ceci necessite une fonction ayant des entrées de type unsigned char*
je veux savoir s'il y'a une fonction qui converti uint8_t à unsigned char* autre que sprintf
Y'a t'il quelqu'un qui peut m'aider à propos de ceci ??
Merci d'avance.
A voir également:

4 réponses

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
Modifié par gravgun le 6/05/2014 à 16:39
'lut,
uint8_t
et
unsigned char
c'est la même chose sur la grande plupart des systèmes. Un
unsigned char*
pointe juste vers un ou plusieurs
unsigned char
, généralement c'est un string, mais ça peut aussi être juste une séquence d'entiers 8bits.
Si ta fonction prend la taille des données (en octets) comme argument, alors
uint8_t monOctet = 0xAF;
envoi_serie(*monOctet, 1);
enverra l'octet.
Si elle prend juste une série et s'attend à un caractère NUL pour déterminer la fin, il faudra faire comme ceci:
uint8_t mesOctets[] = {0xAF, 0x00};
envoi_serie(mesOctets);

from human import idiocy
del idiocy
0
meherTABARKA Messages postés 11 Date d'inscription mardi 6 mai 2014 Statut Membre Dernière intervention 8 mai 2014
6 mai 2014 à 17:37
Bonjour,
je vous remercie pour votre réponse,
mais je ne l'ai pas compris
En faut dans mon programme j'ai eu une fonction qui capte la puissance des données reçues ( la puissance en dBm elle peut être entre -150 et 0 )donc le type est int8_t ensuite je veux envoyé cette valeur via le port série mais la fonction qui sert à envoyé via le port série nécessite que la "data" à envoyer doit être de type unsigned char* pour cela je doit donc converti cette valeur en int8_t en unsigned char* comment je peu faire ??
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
Modifié par gravgun le 6/05/2014 à 18:27
Bien comme au dessus, tu prend ta valeur
int8_t
qui fait déjà 1 octet, et pour l'avoir en
unsigned char*
, type accueillant n'importe quel type de données (des octets, tout simplement) quand on veut lire/écrire un fichier/port série/autre, il suffit d'en récupérer l'adresse en mémoire (d'ailleurs la syntaxe de ma réponse est erronée, c'est
&monOctet
au lieu de
*monOctet
) pour la passer à ta fonction, et préciser que tes données font 1 octet de long.
0
meherTABARKA Messages postés 11 Date d'inscription mardi 6 mai 2014 Statut Membre Dernière intervention 8 mai 2014
6 mai 2014 à 18:39
Excusez moi mais j'ai pas quand même compris la réponse et comment ça se passe pour la résolution
*****************************************
if (rxPacket.packet[i] == 's')
{

putchar(rxPacket.packet[i]);
rss=rxPacket.rssi;
*s1=rss;
//sprintf(s1,"%d", rss);
printf(" s1 est %c\r\n", s1);
halCommonDelayMilliseconds(1000);
sendData(1, s1, TYPE_SERIAL);
}
*****************************
ceci la partie de mon code rss est la valeur de la puissance que je la récupére de packet reçu "rxPacket
J'ai déclaré une variable unsigned char* s1; pour que je puisse l'affecter la valeur de la puissance rss mais toujours y'a pas de nouveau et j'aurai pas de résultat
à noter que:
s est la valeur que je l'utilise comme étant une donnée reçu
sendData est la fonction d'envoi 1 est la longueur de la "data" à envoyer et TYPE_SERIAL veut dire envoyer des données type série
s'il vous plaie m'écrivez votre proposition pour ceci je veu envoyer rss qui est de type int8_t par la fonction senData qui n'accepte que les données de type unsigned char**
Désolé pour la dérange
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
Modifié par gravgun le 6/05/2014 à 19:16
unsigned char* s1
est n'est pas initialisée; elle peut donc contenir n'importe quelle adresse, et y écrire quelque chose peut faire planter ton programme.
Non, il faut faire
s1 = &rss;
pour qu'
s1
pointe vers le contenu de la variable
rss
. Mais il faut alors que
rss
soit du type
int8_t
.
Et
%c
dans le
printf
s'attend à un paramètre de type
char
, pas
char*
, il faut donc aller chercher la valeur pointée:
printf(" s1 est %c\n", *s1); 
Aussi, le
\r
n'est pas nécessaire car si ton OS respecte le standard C (mais on sait tous que Microsoft et les standards ça fait 2),
\n
devient le/les caractère(s) de retour à la ligne (CR+LF sur Windows).
Une fois ça corrigé, le
sendData
devrait réussir.
0
meherTABARKA Messages postés 11 Date d'inscription mardi 6 mai 2014 Statut Membre Dernière intervention 8 mai 2014
Modifié par meherTABARKA le 6/05/2014 à 21:05
Bonsoir encore je vous remercie pour votre temps,
Le même erreur existe encore en fait j'ai initialisé la valeur de s1 à une chaine vide "" et j'ai fait les modifications que vous m'avez demandé, et quand même il me donne "?" comme résultat en tant que la valeur qu'il doit m'afficher c'est -22 comme indique le message que je fait avant la phase de conversion
à noter que quand je fait la compilation un message de warning s'affiche:

Warning[Pe513]: a value of type "int8_t *" cannot be assigned to an entity of type "unsigned char *"
l'exécution au niveau transmetteur
 me donne :

la valeur de rssi est -22
s1 est ?
et au niveau récepteur qui va recevoir la valeur envoyée par la fonction sendData ou j'ai mis l'instruction : putchar( rxPacket.packet[i]); pour qu'il m'affiche directement la valeur qu'il a reçu l'exécution me donne :
?
Ici la nouvelle version du code


uint8_t i;
int8_t rss;
//int8_t s;
unsigned char* s1="";
/* print out any packets that were received */
if(packetReceived == TRUE)
{
for (i = 9; i <= rxPacket.packet[0]; i++)
{
if (rxPacket.packet[i] == 's')
{

printf("la valeur rssi est %d\n", rxPacket.rssi);
rss=rxPacket.rssi;
s1=&rss;
printf(" s1 est %c\n", *s1);
halCommonDelayMilliseconds(1000);
sendData(1, s1, TYPE_SERIAL);
}

Comment je dois faire face à ce problème :(
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
6 mai 2014 à 21:26
On n'assigne pas un
unsigned char*
à une chaine de caractères, mais uniquement un
const char*
, mais ce n'est pas ce que tu cherches. Et comme on réassigne
s1
, on perd de la mémoire -> pas bien.
Il faut changer le
%c
en
%d
dans le
printf
, ainsi que convertir s1:
(int)(*s1)
, car on veut re-avoir la température sous forme décimale.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
8 mai 2014 à 12:48
Bonjour,

J'ai pas lu tout le post.
Pourrais-tu faire un résumé de tout ce qui ne va pas :-).

Cdlt,
0
meherTABARKA Messages postés 11 Date d'inscription mardi 6 mai 2014 Statut Membre Dernière intervention 8 mai 2014
Modifié par meherTABARKA le 8/05/2014 à 13:18
Bon j'ai eu des capteurs chacun contient un microcontrolleur programmable en langage c, j'envoie des signaux entre les capteur, le capteurs en réception va calculer la puissance du signal reçu et aprés il va la transmettre vers un capteur lié au PC pour que cette valeur sera traité ultérieurement,
Pour cela au début j'ai eu des problèmes lors de la transmission que je l'ai résolu avec l'aide de Mr @gravgun que je le remercie
mais à cette stade pour que le capteur lié au PC connait de quel capteur la valeur a été reçu je veux avec la valeur de la puissance envoyé un identifiant par exemple 1, 2, 3,
Quand je fait les transformation nécessaire le capteur lié au PC il m
'affiche de fausses valeurs par exemple si la valeur est 23 et l'identifiant est 11 je veux qu'il m'affiche 2311, par contre il m'affiche 96.

Ici la partie de code pour que vous pouvez faire un coup d'oeuil afin de mieux comprendre ce que je viens d'expliquer


uint8_t i;
int16_t rss=0;

//int8_t s;
unsigned char* s1="1212";
/* print out any packets that were received */
if(packetReceived == TRUE)
{
for (i = 9; i <= rxPacket.packet[0]; i++)
{
if (rxPacket.packet[i] == 's')
{
printf("la valeur la puissance est %d\n", rxPacket.rssi);
rss=rxPacket.rssi;
printf(" rss est %d\n", rss);
s1=(unsigned char*)&rs;
printf(" s1 est %d\n", (int)(*s1));
halCommonDelayMilliseconds(1000);
sendData(1, s1, TYPE_SERIAL);
}
}
packetReceived = FALSE;
}


Ici rss est la valeur de la puissance
sendData est la fonction d'envoi
et packetReceived est un booleén qui teste si un signal est reçu ou non
rxPacket est un signal sous forme d'un packet.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
8 mai 2014 à 13:53
C'est quoi rs ?
C'est quoi son type ?

s1=(unsigned char*)&rs;
printf(" s1 est %d\n", (int)(*s1));

Tu veux faire quoi avec ça ??
0
meherTABARKA Messages postés 11 Date d'inscription mardi 6 mai 2014 Statut Membre Dernière intervention 8 mai 2014
Modifié par meherTABARKA le 8/05/2014 à 14:22
ahhh non rs c'est rss faute de copie
Mais avec s1=(unsigned char*)&rs; je veux convertit la valeur de la puissance qui est de type unint8_t en unsigned char* car la fonction sendData n'accepte que unsigned char* en paramètres
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
8 mai 2014 à 14:36
@fiddy, le moceau de code que tu as copié, c'est moi qui l'ai pondu, mais c'est moche... C'était vraiment pour le debugging.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
8 mai 2014 à 15:03
Ben, ça ne convertit rien du tout le cast...
Pour convertir 12 en "12", le plus simple est d'utiliser sprintf().
Sinon, il faut se faire une fonction de conversion.
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
8 mai 2014 à 15:05
"ça ne convertit rien du tout le cast", c'était bien le but! Juste pour vérifier que le pointeur était correct. Je suis en train de causer avec lui en MP pour savoir quel type de données veut son microcontrôleur, mais ça reste pas très clair...
0