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
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
A voir également:
- Conversion de int en char
- Coco char - Accueil - Réseaux sociaux
- Monnaie conversion - Télécharger - Banque & Budget
- Conversion mb en go ✓ - Forum Mail
- Conversion ascii - Guide
- Conversion m3 en m2 ✓ - Forum Loisirs / Divertissements
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
Modifié par gravgun le 6/05/2014 à 16:39
'lut,
Si ta fonction prend la taille des données (en octets) comme argument, alors
Si elle prend juste une série et s'attend à un caractère NUL pour déterminer la fin, il faudra faire comme ceci:
from human import idiocy
del idiocy
uint8_tet
unsigned charc'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
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
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 ??
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 ??
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
Modifié par gravgun le 6/05/2014 à 18:27
Bien comme au dessus, tu prend ta valeur
int8_tqui 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
&monOctetau lieu de
*monOctet) pour la passer à ta fonction, et préciser que tes données font 1 octet de long.
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
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
*****************************************
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
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
Modifié par gravgun le 6/05/2014 à 19:16
unsigned char* s1est 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'
s1pointe vers le contenu de la variable
rss. Mais il faut alors que
rsssoit du type
int8_t.
Et
%cdans le
printfs'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
\rn'est pas nécessaire car si ton OS respecte le standard C (mais on sait tous que Microsoft et les standards ça fait 2),
\ndevient le/les caractère(s) de retour à la ligne (CR+LF sur Windows).
Une fois ça corrigé, le
sendDatadevrait réussir.
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
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 :(
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 :(
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
6 mai 2014 à 21:26
On n'assigne pas un
Il faut changer le
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
%cen
%ddans le
printf, ainsi que convertir s1:
(int)(*s1), car on veut re-avoir la température sous forme décimale.
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
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,
J'ai pas lu tout le post.
Pourrais-tu faire un résumé de tout ce qui ne va pas :-).
Cdlt,
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
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.
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.
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
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 ??
C'est quoi son type ?
s1=(unsigned char*)&rs;
printf(" s1 est %d\n", (int)(*s1));
Tu veux faire quoi avec ça ??
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
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
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
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
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.
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
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.
Pour convertir 12 en "12", le plus simple est d'utiliser sprintf().
Sinon, il faut se faire une fonction de conversion.
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
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...