IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Convertir char en uint8_T


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Points : 55
    Points
    55
    Par défaut Convertir char en uint8_T
    Bonjour, j'ai le prototype de fonction suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	/**
             * @brief       Envoi une chaine de caractere sur l'USARTx. Fonction BLOCANTE si un caractere est deja en cours d'envoi.
             * @func        void UART_putc(UART_HandleTypeDef * UART_Handle, char c)
             * @param       str : la chaine de caractère Ã* envoyer
             * @param       USARTx : USART1, USART2 ou USART6
             */
    	void UART_puts(uart_id_e uart_id, uint8_t * str, uint8_t len);
    Je veux ecrire une chaine de caractere dans l'uart donc j'ai code cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char str[20];
    void measure(void){
    	sprintf(str,"AT$SF=A10A\n");
    	UART_puts(UART2_ID, str, sizeof(str));
    	HAL_Delay(3000);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ../Src/main.c: In function 'measure':
    ../Src/main.c:241:22: warning: pointer targets in passing argument 2 of 'UART_puts' differ in signedness [-Wpointer-sign]
      UART_puts(UART2_ID, str, sizeof(str));
                          ^~~
    Sauf que le 2eme argument doit etre de type uint8_t, j'ai tente des trucs avec la fonction atoi(); mais je n'arrive pas a un resultat correct, comment passer d'un char a un uint8_t ?

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Tu ne cherches pas à convertir un char en uint8_t mais un char * en uint8_t *. Un simple cast suffit.

    Tu peux ajouter _Static_assert(sizeof(char) == sizeof(uint8_t), "error: char is not 8-bit wide"); quelque part afin de détecter une éventuelle plate-forme incompatible où un cast ne fonctionnerait pas (rarissime).

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Points : 55
    Points
    55
    Par défaut
    Salut, merci pour ta reponse.

    Je suis pas sur de savoir ce qu'est un "Cast".

    En lisant un peu sur le net je me dis que ca doit ressembler a cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char str[20];
    void measure(void){
    	sprintf(str,"AT$SF=A10A\n");
    	UART_puts(UART2_ID, (uint8_t)str, sizeof(str));
    	HAL_Delay(3000);
    }
    Mais j'ai toujours un probleme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ../Src/main.c: In function 'measure':
    ../Src/main.c:241:22: warning: passing argument 2 of 'UART_puts' makes pointer from integer without a cast [-Wint-conversion]
      UART_puts(UART2_ID, (uint8_t)*str, sizeof(str));
                          ^



    EDIT:
    J'avais pas mis la petite etoile pour le pointeur !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char str[12];
    void measure(void){
    	sprintf(str,"AT$SF=A10A\n");
    	UART_puts(UART2_ID, (uint8_t*)str, sizeof(str));
    	HAL_Delay(3000);
    }
    Merci pour ton aide

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tengalice49 Voir le message
    Je suis pas sur de savoir ce qu'est un "Cast".
    Bonjour

    C'est une opération qui demande au C de considérer une variable dans un autre type que ce qu'elle est. C'est d'ailleurs de la même racine que "casting" (= jouer un rôle en anglais).
    Généralement c'est implicite ex: char x='a'; x=x+1; => l'opération se fera avec des entiers et donc la variable "x" sera considérée comme contenant un nombre entier même si elle contient un caractère (qui n'est qu'un petit entier en fait).
    Parfois, il faut le demander explicitement ex int x=10; float f=float(x) / 3 => la variable "x" sera considérée comme contenant un nombre à virgule flottante pour que la division se fasse en décimal sinon elle se fait en entier.
    Il ne peut bien entendu se faire que si les valeurs sont compatibles (dans le premier cas le caractère 'a' est converti en valeur ascii qui est un nombre entier et dans le second cas, le nombre "10" devient "10.0").

    Citation Envoyé par tengalice49 Voir le message
    J'avais pas mis la petite etoile pour le pointeur !
    Hé oui, le type "uint8_t" (entier) n'est pas du tout la même chose que le type "uint8_t étoile" (adresse d'un uint8_t). Dans ton premier exemple tu as tenté de convertir l'adresse d'un caractère en entier, alors qu'il fallait la convertir en adresse d'un uint8_t.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Points : 55
    Points
    55
    Par défaut
    Salut Sve@r, merci pour les precisions!

    Au passage, sauriez-vous pourquoi j'ai un espace (ou un caractere carre?) qui se fait au debut de chaque ligne? Est ce que ca peut venir de la taille du char?

    Nom : commandat.jpg
Affichages : 1789
Taille : 108,5 Ko

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. convertir char* en CString
    Par zelchico dans le forum MFC
    Réponses: 5
    Dernier message: 06/12/2007, 15h55
  2. Convertir Char* en String
    Par Blunt dans le forum C++/CLI
    Réponses: 1
    Dernier message: 01/07/2007, 16h46
  3. Convertir char* en string
    Par KorTeX22 dans le forum C++
    Réponses: 5
    Dernier message: 13/03/2007, 11h54
  4. Comparer 2 Char / Convertir Char -> Int
    Par mbk-w dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/06/2006, 11h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo