C - Renvoi d'une chaine de caractere
Répondre à la discussion
Affichage des résultats 1 à 24 sur 24

C - Renvoi d'une chaine de caractere



  1. #1
    joseph20480

    C - Renvoi d'une chaine de caractere


    ------

    Bonjour,

    J'ai développé un "robot" avec asservissement en vitesse des moteurs (et odométrie).
    Cela fonctionne plutôt correctement mais je bute sur quelques lignes de codes.
    En effet j'essaie de mettre en place une liaison UART (via Bluetooth) avec un protocole du type AT+.

    Ou j'en suis:
    > Liaison BT avec connexion automatique : ok
    > Réception de la trame envoyée, depuis mon pc, avec détection STX et EXT : ok
    > D'une commande de type "AT+SPEED?", j'arrive a extraire la commande "SPEED".

    Mon problème est que je bute sur le renvoie de la valeur "Command" ( ici "SPEED") par ma fonction "Command_extract".
    Je développe sur STM32 avec la librairie officielle HAL.

    Ma donnée est enregistrée sous la forme d'un tableau de char, sous la forme array[0] = S / array[1] = P / ...
    L'idée est donc de convertir cette donnée en un integer qui sera retournée par la fonction.

    il semblerais que la commande adéquate serait Atoi(), est bien cela ? il semblerait qu'elle nécessaire un caractère supplémentaire pour définir la fin de la donnée.
    Si une bonne âme passe par la, je suis preneur.

    -----
    Dernière modification par joseph20480 ; 07/06/2023 à 13h33.

  2. #2
    joseph20480

    Re : C - Renvoie d'une chaine de caractere

    Lidée étant de comparer le nom de la commande dans un switch case ()

  3. #3
    umfred

    Re : C - Renvoie d'une chaine de caractere

    Atoi c'est pour convertir UN caractère en entier.
    Le problème se situe peut-être du côté du PC qui attend un caractère de fin de ligne (souvent le caractère 13 (0x0d) ou 10 (0x0a))pour "réagir" selon la façon dont tu fais la réception côté PC.

  4. #4
    joseph20480

    Re : C - Renvoie d'une chaine de caractere

    Bonjour,

    Coté pc, c'est un simple terminal série (Docklight).
    As tu une piste pour solutionner mon probleme, a savoir donc convertir mes données dans un tableau en un integer ?

  5. A voir en vidéo sur Futura
  6. #5
    pm42

    Re : C - Renvoie d'une chaine de caractere

    Citation Envoyé par joseph20480 Voir le message
    As tu une piste pour solutionner mon probleme, a savoir donc convertir mes données dans un tableau en un integer ?
    De ce que tu nous as dit, ton tableau de caractères contient des trucs comme "SP...". On voit mal comment on pourrait le transformer en entier.

    Après, tu parles de "faire un switch case sur le nom de la commande" ce qui laisserait entendre un switch case sur une chaine de caractère ce qui n'est supporté en C.

    Donc il faudrait que tu précises ce que tu veux faire parce ce n'est pas clair du tout.

  7. #6
    umfred

    Re : C - Renvoie d'une chaine de caractere

    à mon avis, tu dois probablement "juste" envoyer ton tableau de caractères (pas besoin de le convertir), ou convertir ton tableau de char en chaine (string) avec par exemple strcpy ou strncpy (en pensant à bien rajouter '/0' à la fin ) avant de l'envoyer

  8. #7
    pm42

    Re : C - Renvoi d'une chaine de caractere

    Dans ce cas là, il doit faire attention à ce que son tableau ne soit pas alloué sur la pile de la fonction qui le renvoie.

  9. #8
    ArchoZaure

    Re : C - Renvoi d'une chaine de caractere

    Bonjour.

    Citation Envoyé par joseph20480 Voir le message
    Ma donnée est enregistrée sous la forme d'un tableau de char, sous la forme array[0] = S / array[1] = P / ...
    L'idée est donc de convertir cette donnée en un entier qui sera retournée par la fonction.
    Effectivement, comme vous le précisez, si vous voulez faire un switch case vous devez convertir votre chaine en valeur numérique.
    Une méthode simple serait de tester la chaine (ou chaque caractère séparément mais vous voyez) pour voir si elle vaut "command" et lui attribuer une valeur.
    Cette valeur numérique peut ensuite être employée dans un switch case
    Comme par exemple ici :
    https://stackoverflow.com/questions/...itch-statement

    Le code qui m'a l'air pas mal:

    Code:
    #define BADKEY -1
    #define A1 1
    #define A2 2
    #define B1 3
    #define B2 4
    
    typedef struct { char *key; int val; } t_symstruct;
    
    static t_symstruct lookuptable[] = {
        { "A1", A1 }, { "A2", A2 }, { "B1", B1 }, { "B2", B2 }
    };
    
    #define NKEYS (sizeof(lookuptable)/sizeof(t_symstruct))
    
    int keyfromstring(char *key)
    {
        int i;
        for (i=0; i < NKEYS; i++) {
            t_symstruct *sym = lookuptable[i];
            if (strcmp(sym->key, key) == 0)
                return sym->val;
        }
        return BADKEY;
    }
    
    /* ... */
    switch (keyfromstring(somestring)) {
    case A1: /* ... */ break;
    case A2: /* ... */ break;
    case B1: /* ... */ break;
    case B2: /* ... */ break;
    case BADKEY: /* handle failed lookup */
    }
    https://stackoverflow.com/questions/...itch-statement
    Dernière modification par ArchoZaure ; 07/06/2023 à 15h38.

  10. #9
    joseph20480

    Re : C - Renvoi d'une chaine de caractere

    Bonjour,

    Ce que je cherche a faire c'est de pouvoir utiliser un protocole du type ATcommand et de pouvoir faire en sorte que mon µC puisse répondre correctement en fonction de la commande.
    Le but ici, est de pouvoir traiter la commande un fois extraite.
    > Les commandes AT seront envoyer a partir d'un terminal série sur pc.
    > A réception de la trame, en fonction de la commande je traite la tache.

    J'entends vos retours.
    Avez vous une piste, un conseil ?

  11. #10
    umfred

    Re : C - Renvoi d'une chaine de caractere

    Tu dis que tu sais recevoir la commande envoyée depuis le PC, donc tu dois savoir comment envoyer des données par le même canal, non ? (sinon regarder la doc de la fonction de réception qui doit indiquer la méthode d'envoi).
    Je ne vois pas trop sur quoi tu bloques, sans code ou plus d'info sur la manière dont tu procèdes et les messages d'erreurs éventuels.
    au pif, j'ai trouvé ça http://cedric.cnam.fr/~puechm/ens/usrs26/cours4.pdf

  12. #11
    polo974

    Re : C - Renvoi d'une chaine de caractere

    Soit tu veux un test certain et tu es obligé de faire une série de comparaison de str
    , soit tu acceptes un risque de collision et tu utilises un hash (tu peux lever le doute sur le hash avec une comparaison de str.
    A toi de trouver un hash (rapide) qui ne provoque pas de collision entre tes commandes...



    Ou faire une recherche dichotomique (des switch imbriqués).

    Il y a d'autres astuces pour optimiser en jouant sur le type de pointeur pour réduire le nombre de tests, mais c'est pas beau...

    Sinon, utiliser un "lexer" genre le "bon" vieux flex (utilisé son ancêtre lex il y a "fort fort longtemps")) ou RE/flex (tout juste trouvé)...
    Dernière modification par polo974 ; 07/06/2023 à 19h44.
    Jusqu'ici tout va bien...

  13. #12
    umfred

    Re : C - Renvoi d'une chaine de caractere

    une autre façon, de comparer la chaine reçu à la commande serait d'utiliser une succession de test avec strcmp pour comparer si 2 chaines sont égales (au lieu de switch case)

  14. #13
    Biname

    Re : C - Renvoi d'une chaine de caractere

    Salut,
    J'ai posé la question à GPT, voici sa réponse :
     Cliquez pour afficher


    Biname

  15. #14
    ArchoZaure

    Re : C - Renvoi d'une chaine de caractere

    Citation Envoyé par Biname Voir le message
    Salut,
    J'ai posé la question à GPT, voici sa réponse :
    Une réponse débile, on s'en serait douté.

  16. #15
    umfred

    Re : C - Renvoi d'une chaine de caractere

    elle est pas si débile que ça
    (mais honte à moi qui ai fait une réponse erronée sur atoi, qui ne convertit pas UN caractère, mais une représentation d'un nombre en entier, "A.." ou "B.." donnera 0, alors que "121" ou "121A" donnera 121 et je doute (comme mentionner plus haut) que ce soit vraiment le besoin)

  17. #16
    pm42

    Re : C - Renvoi d'une chaine de caractere

    Citation Envoyé par umfred Voir le message
    elle est pas si débile que ça
    (mais honte à moi qui ai fait une réponse erronée sur atoi
    Oui, elle est en effet très correcte et a corrigé une erreur que tu as faite et que je n'ai pas relevé.
    Ce qui est débile, c'est de n'intervenir que pour flinguer sans rien apporter au fil et en plus en n'étant clairement pas capable d'évaluer une réponse.

    Ceci dit, utiliser ChatGPT pour débloquer ce genre de situation est en général très efficace mais il faut lui poser les bonnes questions.
    La demande initiale était difficilement compréhensible parce qu'elle mélangeait un peu tout et la recopier telle quelle ne va pas faire de miracle.

    On est passé ensuite à une description très générale du problème mais par quelqu'un qui visiblement veut coder sans avoir les bases ce qui rend difficile d'aider.

  18. #17
    ArchoZaure

    Re : C - Renvoi d'une chaine de caractere

    Citation Envoyé par pm42 Voir le message
    Oui, elle est en effet très correcte et a corrigé une erreur que tu as faite et que je n'ai pas relevé.
    Faut savoir.

    Citation Envoyé par pm42
    De ce que tu nous as dit, ton tableau de caractères contient des trucs comme "SP...". On voit mal comment on pourrait le transformer en entier.

    Ce qui est débile, c'est de n'intervenir que pour flinguer sans rien apporter au fil et en plus en n'étant clairement pas capable d'évaluer une réponse.
    Elle est pas mal celle-là sachant que

    Citation Envoyé par Josep20480
    Ma donnée est enregistrée sous la forme d'un tableau de char, sous la forme array[0] = S / array[1] = P / ...
    L'idée est donc de convertir cette donnée en un integer qui sera retournée par la fonction.
    Et vous répondez

    Citation Envoyé par pm42
    Après, tu parles de "faire un switch case sur le nom de la commande" ce qui laisserait entendre un switch case sur une chaine de caractère ce qui n'est supporté en C.
    Puisque vous n'avez pas compris que la demande consiste justement à convertir la chaine en integer selon un mécanisme différent de celui d'un atoi()...
    Et vous avez la même compréhension du problème que ChatGPT finalement.
    Non mais j'ai rien dit, vous êtes cohérent avec vous-même finalement.

    Mais assez parlé de vous si vous le voulez bien.
    Attendons-donc un peu les précisions de joseph20480

  19. #18
    umfred

    Re : C - Renvoi d'une chaine de caractere

    On peut aussi rappeler qu'un caractère est également un entier, le caractère étant sa représentation en ASCII (pour le cas le plus simple) ("A" étant égale à 0x41 = 65).
    printf("%d",'A') => 65
    Dernière modification par umfred ; 08/06/2023 à 14h41.

  20. #19
    pm42

    Re : C - Renvoi d'une chaine de caractere

    Oui mais la demande initiale était en fait "comment je traite un jeu de commande de type AT". La conversion en entier n'a pas lieu d'être et n'était là que parce que le primo-posteur a mal analysé son besoin et proposé une solution qui est loin d'être optimale voire même à éviter, un grand classique.

    Le plus simple est probablement de traiter cela avec les fonctions de manipulation de chaînes de caractère du C ce qui a en plus l'avantage de faire du code relativement compact pour l'uc.

    Si on veut faire un squelette avec ChatGPT, on peut lui demander : "Peux tu écrire en C un programme qui traite des commandes de type "AT" comme utilisées par les modems ?"

    Ce qui donne un 1er jet qu'on peut adapter soi même ou même lui demander de modifier :

    Code:
    Voici un exemple de programme en C qui traite des commandes de type "AT" utilisées par les modems. Ce programme simple reconnaît quelques commandes AT de base et affiche une réponse appropriée. Vous pouvez étendre ce programme pour inclure des commandes supplémentaires et des fonctionnalités selon vos besoins.
    
    ```c
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    void process_command(const char *command);
    
    int main() {
        char input[256];
    
        printf("Entrez une commande AT (ou tapez 'exit' pour quitter) : ");
        while (fgets(input, sizeof(input), stdin) != NULL) {
            if (strncmp(input, "exit", 4) == 0) {
                break;
            }
            process_command(input);
            printf("\nEntrez une commande AT (ou tapez 'exit' pour quitter) : ");
        }
    
        return 0;
    }
    
    void process_command(const char *command) {
        if (strncmp(command, "AT", 2) != 0) {
            printf("ERREUR: La commande doit commencer par 'AT'\n");
            return;
        }
    
        command += 2;
    
        if (strncmp(command, "I", 1) == 0) {
            printf("OK - Information sur le modem\n");
        } else if (strncmp(command, "D", 1) == 0) {
            printf("OK - Composer un numéro\n");
        } else if (strncmp(command, "H0", 2) == 0) {
            printf("OK - Raccrocher\n");
        } else if (strncmp(command, "H1", 2) == 0) {
            printf("OK - Décrocher\n");
        } else if (strncmp(command, "E0", 2) == 0) {
            printf("OK - Désactiver l'écho\n");
        } else if (strncmp(command, "E1", 2) == 0) {
            printf("OK - Activer l'écho\n");
        } else {
            printf("ERREUR: Commande non reconnue\n");
        }
    }
    ```
    
    Ce programme lit les commandes AT entrées par l'utilisateur et appelle la fonction `process_command` pour traiter chaque commande. La fonction `process_command` vérifie si la commande commence par "AT" et traite ensuite les commandes spécifiques telles que "ATI" (information sur le modem), "ATD" (composer un numéro), "ATH0" (raccrocher), "ATH1" (décrocher), "ATE0" (désactiver l'écho) et "ATE1" (activer l'écho). Si la commande n'est pas reconnue, le programme affiche un message d'erreur.
    Dernière modification par JPL ; 08/06/2023 à 16h58. Motif: Remplacement de la balise Quote par Code

  21. #20
    ArchoZaure

    Re : C - Renvoi d'une chaine de caractere

    Ben moi j'ai tapé votre demande : Peux tu écrire en C un programme qui traite des commandes de type "AT" comme utilisées par les modems ?

    Et "curieusement" on n'a pas le même résultat.

    En mode équilibré.

    Citation Envoyé par BING
    Bien sûr! Voici un exemple de programme en C qui traite des commandes de type “AT” comme utilisées par les modems. Ce programme est basé sur la bibliothèque standard C et utilise la fonction fgets pour lire les commandes entrées par l’utilisateur. Il utilise également la fonction strncmp pour comparer les chaînes de caractères entrées avec les commandes “AT” attendues.
    Code:
    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char buffer[256];
        while (1) {
            printf("Entrez une commande AT : ");
            fgets(buffer, 256, stdin);
            if (strncmp(buffer, "AT", 2) == 0) {
                printf("Commande AT détectée !\n");
            } else {
                printf("Commande non reconnue.\n");
            }
        }
        return 0;
    }
    Citation Envoyé par BING
    J’espère que cela vous aidera! N’hésitez pas à me poser des questions si vous avez besoin d’aide supplémentaire.
    En mode précis :

    Citation Envoyé par BING
    Bien sûr! Voici un exemple de programme en C qui traite des commandes de type “AT” utilisées par les modems:
    Code:
    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char command[100];
        printf("Entrez une commande AT: ");
        scanf("%s", command);
    
        if (strncmp(command, "AT", 2) == 0) {
            printf("Commande AT reçue: %s\n", command);
            // Traitement de la commande AT ici
        } else {
            printf("Commande non reconnue\n");
        }
    
        return 0;
    }
    Citation Envoyé par BING
    Ce programme demande à l’utilisateur d’entrer une commande AT, puis vérifie si la commande commence par “AT”. Si c’est le cas, le programme affiche la commande et peut ensuite la traiter. Sinon, il affiche un message indiquant que la commande n’est pas reconnue. Est-ce que cela répond à votre question?
    Du bidon quoi, comme d'hab.

  22. #21
    umfred

    Re : C - Renvoi d'une chaine de caractere

    probablement pas la même version de chatgpt, celui de bing semble plus fainéant que l'autre (les réponses sont similaires mais celle de bing gpt est moins développée)

  23. #22
    pm42

    Re : C - Renvoi d'une chaine de caractere

    Citation Envoyé par umfred Voir le message
    probablement pas la même version de chatgpt, celui de bing semble plus fainéant que l'autre (les réponses sont similaires mais celle de bing gpt est moins développée)
    C'est surtout qu'on a chroniquement un petit groupe d'anti-IA fanatiques qui n'arrivent pas du tout à s'en servir malgré de nombreuses explications et sont persuadés que tout ce qui les dépassent est forcément nul (machine ou humain).
    Je vais arrêter là : le primo-posteur n'est pas revenu et qu'on va boucler sur les remarques du genre "je ne suis pas capable d'expliquer, je n'ai même pas compris la demande initiale mais je vais vous expliquer agressivement pourquoi les IAs et pm42 sont nuls", il y a assez peu d'intérêt à continuer à nourrir le troll dont les contributions ne sont que de l'agressivité gratuite.

  24. #23
    ArchoZaure

    Re : C - Renvoi d'une chaine de caractere

    Citation Envoyé par pm42 Voir le message
    C'est surtout qu'on a chroniquement un petit groupe d'anti-IA fanatiques qui n'arrivent pas du tout à s'en servir malgré de nombreuses explications et sont persuadés que tout ce qui les dépassent est forcément nul (machine ou humain).
    Il en faut bien un pour éviter qu'un unique fanatique fasse croire que GPT peut faire n'importe quoi.
    Une autre version de ChatGPT vous disiez ? (ben non... vous n'oseriez pas tout de même ).
    Moi j'aurais plutôt conclu que vous avez omit de nous fournir les demandes successives qui ont permis d'arriver (enfin...) au résultat que vous attendiez.
    Il s'agit d'une maigre victoire... faire faire à l'IA ce qu'on sait déjà faire avant...
    Lève la papatte ! Bon ChatGPT !

    Citation Envoyé par pm42
    Je vais arrêter là : le primo-posteur n'est pas revenu et qu'on va boucler sur les remarques du genre "je ne suis pas capable d'expliquer, je n'ai même pas compris la demande initiale mais je vais vous expliquer agressivement pourquoi les IAs et pm42 sont nuls", il y a assez peu d'intérêt à continuer à nourrir le troll dont les contributions ne sont que de l'agressivité gratuite.
    Venant de vous cette remarque est particulièrement savoureuse.

  25. #24
    umfred

    Re : C - Renvoi d'une chaine de caractere

    https://www.androidauthority.com/cha...-chat-3292126/
    ChatGPT may offer longer creative responses. However, this may come at the expense of accuracy as it cannot fact-check its responses with external sources.
    Dans Bing, il y a 3 modes selon ce même site, le mode créatif, dont tu n'as pas mis la réponse
    Dans ce mode, il me sort:
    Bonjour, c'est Bing. Je vais essayer de créer ce programme en C. Voici un exemple possible:

    Code:
    #include <stdio.h>
    #include <string.h>
    
    // Fonction qui traite une commande AT et renvoie une réponse
    char* traiter_commande(char* commande) {
      // Si la commande est vide, renvoyer "OK"
      if (strlen(commande) == 0) {
        return "OK";
      }
      // Si la commande commence par "AT+", extraire le nom de la commande et les paramètres
      else if (strncmp(commande, "AT+", 3) == 0) {
        char* nom = strtok(commande + 3, "=");
        char* param = strtok(NULL, "=");
        // Si la commande est "AT+DIAL", composer le numéro donné en paramètre
        if (strcmp(nom, "DIAL") == 0) {
          printf("Composing %s\n", param);
          return "CONNECT";
        }
        // Si la commande est "AT+HANGUP", raccrocher
        else if (strcmp(nom, "HANGUP") == 0) {
          printf("Hanging up\n");
          return "OK";
        }
        // Si la commande est inconnue, renvoyer "ERROR"
        else {
          return "ERROR";
        }
      }
      // Si la commande n'est pas une commande AT, renvoyer "ERROR"
      else {
        return "ERROR";
      }
    }
    
    // Fonction principale qui lit les commandes de l'entrée standard et les traite
    int main() {
      char buffer[100];
      while (1) {
        // Lire une ligne de l'entrée standard
        printf("AT> ");
        fgets(buffer, 100, stdin);
        // Enlever le caractère de fin de ligne
        buffer[strcspn(buffer, "\n")] = 0;
        // Traiter la commande et afficher la réponse
        char* reponse = traiter_commande(buffer);
        printf("%s\n", reponse);
      }
      return 0;
    }
    On retrouve une réponse "curieusement" plus proche de celle de ChatGPT
    Dernière modification par umfred ; 08/06/2023 à 19h05.

Discussions similaires

  1. [Programmation] PIC C18 chaine de caractère et I2C
    Par Leo_Isere dans le forum Électronique
    Réponses: 2
    Dernier message: 19/03/2017, 23h01
  2. [C] Concaténer chaine de caractère + caractère
    Par invite48ca7510 dans le forum Programmation et langages, Algorithmique
    Réponses: 17
    Dernier message: 26/01/2013, 12h43
  3. chaîne de caractère
    Par invite9c4bf030 dans le forum Programmation et langages, Algorithmique
    Réponses: 6
    Dernier message: 02/04/2012, 20h30
  4. chaine de caractère
    Par invite9f95f6e7 dans le forum Programmation et langages, Algorithmique
    Réponses: 27
    Dernier message: 01/01/2012, 18h38
  5. Chaine de caractère C++
    Par invitee5fedd72 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 06/03/2008, 21h29