Conversion de int en char
meherTABARKA
Messages postés
11
Statut
Membre
-
meherTABARKA Messages postés 11 Statut Membre -
meherTABARKA Messages postés 11 Statut Membre -
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.
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.
4 réponses
-
'lut,
uint8_t
etunsigned char
c'est la même chose sur la grande plupart des systèmes. Ununsigned char*
pointe juste vers un ou plusieursunsigned 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, alorsuint8_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 -
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 ??-
Bien comme au dessus, tu prend ta valeur
int8_t
qui fait déjà 1 octet, et pour l'avoir enunsigned 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. -
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 -
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 faires1 = &rss;
pour qu's1
pointe vers le contenu de la variablerss
. Mais il faut alors querss
soit du typeint8_t
.
Et%c
dans leprintf
s'attend à un paramètre de typechar
, paschar*
, 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é, lesendData
devrait réussir. -
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 :( -
On n'assigne pas un
unsigned char*
à une chaine de caractères, mais uniquement unconst char*
, mais ce n'est pas ce que tu cherches. Et comme on réassignes1
, on perd de la mémoire -> pas bien.
Il faut changer le%c
en%d
dans leprintf
, ainsi que convertir s1:(int)(*s1)
, car on veut re-avoir la température sous forme décimale.
-
-
Bonjour,
J'ai pas lu tout le post.
Pourrais-tu faire un résumé de tout ce qui ne va pas :-).
Cdlt, -
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.