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 :

[PIC] Afficher une trame arrivant sur le port série


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut [PIC] Afficher une trame arrivant sur le port série
    Bonjour


    J'aurai 2 questions svp :

    1)

    Je cherche à programmer un pic pour que lorsqu'il reçoit une trame définie sur son port série, il execute alors une tâche ...

    Le code que j'ai écrit ici bloque systématiquement le déroulement du reste du programme, pouvez vous me dire ce qui est incorrect ?


    ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    case VAR_RX_UART_MESSAGE:
     
    // Test si le mot "*Hello" est reçu sur le port série, si oui OUT1=1
     
    ReadStringUART((BYTE *)reception, sizeof(reception));
    if (strcmp(reception, (char *)"*Hello") == 0)
     
    {
    OUT1 = 1;
    }

    2)

    Quand 1) fonctionnera je voudrai faire cette variante :

    En fonction de l'entete que comportera le mot reçu je voudrais effectuer telle ou telle tâche :

    exemple :

    si le mot recu à pour entete '*' alors je voudrai que OUT1 passe à '1'
    si le mot recu à pour entete '#' alors je voudrai que OUT2 passe à '1'
    si le mot recu à pour entete '$' alors je voudrai que OUT3 passe à '1'

    Je vous remercie beaucoup pour votre aide,

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour
    Citation Envoyé par lcoulon Voir le message
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char reception;
    ReadStringUART((BYTE *)reception, sizeof(reception));
    if (strcmp(reception, (char *)"*Hello") == 0)
    {
        OUT1 = 1;
    }
    char et pointeur sur char sont deux choses différentes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReadStringUART((BYTE *)&reception, sizeof(reception));
    Maintenant, en ce qui concerne la comparaison de 'reception' avec "*Hello", attention, reception est un caractère seul, "*Hello" une chaine de caractère terminée par \0..., or strcmp ne travaille qu'avec des chaines terminées par \0.

    À la limite, tu peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (strncmp(&reception, "*Hello", sizeof reception) == 0)
    {
        OUT1 = 1;
    }
    Citation Envoyé par lcoulon Voir le message

    2)

    Quand 1) fonctionnera je voudrai faire cette vairante :

    En fonction de l'entete que comportera le mot reçu je voudrais effectuer telle ou telle tache :

    exemple :

    si le mot recu à pour entete '*' alors je voudrai que OUT1 passe à '1'
    si le mot recu à pour entete '#' alors je voudrai que OUT2 passe à '1'
    si le mot recu à pour entete '$' alors je voudrai que OUT3 passe à '1'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    char premier_char_du_message;
    switch(premier_char_du_message) {
      case '*':
        OUT1 = '1';
        break;
      case '#':
        OUT2 = '1';
        break;
      case '$':
        OUT3 = '1';
        break;
    }

    EDIT :
    Cela dit, on ne sait pas à quoi correspond la fonction ReadStringUART... un peu plus d'info dessus permettrait peut-être de t'aider plus efficacement.

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    merci Mabu, mais le fait d'ajouter &reception me permettra t-il de stocker l'intégralité de ce qui se présente sur le port série ?

    mon but est capturer la trame entière et non pas qu'un seul caractère .
    De plus, *Hello ne finit par /0 , est ce un pb dans mon cas ?


    Ensuite concernant les entetes, les cases me permettront de faire tel ou tel choix mais comment faire en sorte d'identifier l'entete elle meme ?
    quel code me permet "d'aller voir" la premier caractère d'une trame ?

    Merci à vous,

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    ci joint mon uart.c qui gère la fonction ReadStringUART

    ( comme je débute, ce n'est pas moi qui ai écrit ce pilote )

    J'ai ajouté les &reception mais mon programme bloque toujours .
    Fichiers attachés Fichiers attachés
    • Type de fichier : c UART.c (8,8 Ko, 472 affichages)

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    merci Mabu, mais le fait d'ajouter &reception me permettra t-il de stocker l'intégralité de ce qui se présente sur le port série ?
    Non... mais comme tu as écrit "char reception;", je pensais que c'était voulu.

    Si reception devient un tableau de caractères, les choses changent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char reception[256];
    /* on récupère la trame */
    ReadStringUART((BYTE *)reception, sizeof(reception));
    if (strncmp(reception, "*Hello", strlen("*Hello")) == 0)
    {
    OUT1 = 1;
    }
    Cela dit, merci de nous en dire plus sur ReadStringUART qu'on puisse t'aider... Que retourne cette fonction, ajoute-t-elle un \0 à la fin de la chaine...
    Citation Envoyé par lcoulon Voir le message
    mon but est capturer la trame entière et non pas qu'un seul caractère .
    De plus, *Hello ne finit par /0 , est ce un pb dans mon cas ?
    Et si, la chaine "*Hello" fini par '\0'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     /* tableau de 6 caractères, mais chaine non-valide : ne pas utiliser avec 
       strlen, strcmp...*/
    char test_1[6] = "*Hello";
     
    /* tableau de 7 caractères, chaine valide */
    char test_2[7] = "*Hello";
     
    /* tableau de 7 caractères, chaine valide, mais on 
       laisse au compilateur le soin d'allouer la taille nécessaire*/
    char test_3[] = "*Hello";
    Citation Envoyé par lcoulon Voir le message
    Ensuite concernant les entetes, les cases me permettront de faire tel ou tel choix mais comment faire en sorte d'identifier l'entete elle meme ?
    quel code me permet "d'aller voir" la premier caractère d'une trame ?
    Récupérer la premier caractère d'une trame, sans savoir à quoi ressemble la trame, impossible.

    Récupérer le premier caractère d'une chaine (ou d'un tableau) de caractères, c'est facile : chaine[0] ou * chaine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void premier_element(const char * chaine) {
        if(NULL != chaine) {
            printf("premier caractères de %s : \"%c\"\n", chaine, *chaine);
        } else {
            fprintf(stderr, "erreur : chaine nulle...");
        }
    }
    De la bonne lecture : Les pointeurs démythifiés !
    Dernière modification par Jerome Briot ; 15/10/2010 à 23h42.

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Nos messages se sont croisés, je viens de poster mon fichier uart.c qui gère ReadStringUART

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    Nos messages se sont croisés, je viens de poster mon fichier uart.c qui gère ReadStringUART
    Ok, merci.

    Donc, si ReadStringUART revoie la taille de ce qu'il a écrit, nous pouvons écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    /* ReadStringUART : ne travaille qu'en BYTE : les messages récupérés ne peuvent 
       faire plus de 127 ou 255 caractères (suivant si BYTE est signée ou non)
       Pour ne pas prendre de risque, je me limite à 64.*/
    char reception[64];
    BYTE size;
     
    /* on récupère la trame */
    size = ReadStringUART((BYTE *)reception, sizeof reception - 1);
     
    /* on fait en sorte que reception devienne une chaine de caractères valide */
    reception[size] = '\0'
     
    /* et on peut utiliser strcmp sans risque */
    if (strcmp(reception, "*Hello")) == 0)
    {
        /* faire des choses */
    }

  8. #8
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Je te remercie,

    J'ai une erreur de syntaxe qui remonte sur cette ligne lorsque je compile ...
    je ne vois pas pourquoi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strcmp(reception, "*Hello")) == 0)
    idem si je remplace par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strcmp(reception, "*Hello") == 0)
    Voici comment j'ai procédé :

    j'ai déporté en début de programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char reception[64];
    BYTE size;
    et j'ai inclu dans une boucle infinie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    /* on récupère la trame */
    size = ReadStringUART((BYTE *)reception, sizeof reception - 1);
     
    /* on fait en sorte que reception devienne une chaine de caractères valide */
    reception[size] = '\0'
     
    /* et on peut utiliser strcmp sans risque */
    if (strcmp(reception, "Hello") == 0)
     
    {
        /* faire des choses */
    OUT1 = 1;
    last_OUT1_TickSample = TickGet(); 
    }

  9. #9
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    J'ai une erreur de syntaxe qui remonte sur cette ligne lorsque je compile ...
    Peux tu préciser ce que le compilateur te dit ?

  10. #10
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Le compilateur indique " syntax error" est pointe la ligne, sans me donner plus d'informations.

    je me demande si ce n'est pas ces 2 lignes qui posent pb :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char reception[64];
    BYTE size;
    Je ne peux pas les mettre dans un case ou dans un if, n'est ce pas ?

    Aussi,

    Est ce que ReadStringUART revoie la taille de ce qui est reçu sur le port série ou le contenu de ce qui est reçu ?

    ( d'apres le pilote uart.c que j'utilise, je pense avoir utilisé la bonne fonction mais j'ai quand même un doute, il existe aussi getsUART et aussi ReadUART, j'ai du mal a savoir laquelle utiliser pour capturer ce qui se présente sur mon port série.

  11. #11
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    ( d'apres le pilote uart.c que j'utilise, je pense avoir utilisé la bonne fonction mais j'ai quand même un doute, il existe aussi getsUART et aussi ReadUART, j'ai du mal a savoir laquelle utiliser pour capturer ce qui se présente sur mon port série.
    Tu as le code source et la documentation. Prends ton temps pour lire la doc et étudier le code source...
    Bien le bonjour chez vous
    Jowo

  12. #12
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Citation Envoyé par lcoulon Voir le message
    je me demande si ce n'est pas ces 2 lignes qui posent pb :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char reception[64];
    BYTE size;
    Est ce que BYTE est défini? Par quelque chose du genre:
    A+

    Pfeuh

  13. #13
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Je sais bien Jowo,

    Mais justement, ça fait deja une bonne semaine que je suis sur ce pb sans avancer vraiment.

    si quelqu'un pourrait m'aiguiller un peu vis a vis de uart.c et me donner un peu de code pour dégrossir, cela m'aiderait beaucoup.

  14. #14
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char reception[64];
    BYTE size;
    Je ne peux pas les mettre dans un case ou dans un if, n'est ce pas ?
    On peut toujours déclarer des variables en début de bloc.

    Citation Envoyé par lcoulon Voir le message
    Est ce que ReadStringUART revoie la taille de ce qui est reçu sur le port série ou le contenu de ce qui est reçu ?
    Si on lit le code, on voit qu'il renvoie la taille.

    Et pour rebondir sur la remarque de pfeuh, BYTE est il bien défini dans uart.h ?

  15. #15
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    oui, BYTE est défini mais dans un autre fichier .h ( dans generic_typedefs.h ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef unsigned char        BYTE;    // 8-bit unsigned
    Fichiers attachés Fichiers attachés
    • Type de fichier : h uart.h (3,1 Ko, 63 affichages)

  16. #16
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Auriez vous d'autres pistes qui pourraient expliquer pourquoi le code de mabu me remonte une erreur de syntaxe en pointant BYTE ?

    j'ai passé pas mal de temps sans trouver comment faire pour que ce petit code fonctionne ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /* ReadStringUART : ne travaille qu'en BYTE : les messages récupérés ne peuvent 
       faire plus de 127 ou 255 caractères (suivant si BYTE est signée ou non)
       Pour ne pas prendre de risque, je me limite à 64.*/
    char reception[64];
    BYTE size;
     
    /* on récupère la trame */
    size = ReadStringUART((BYTE *)reception, sizeof reception - 1);
     
    /* on fait en sorte que reception devienne une chaine de caractères valide */
    reception[size] = '\0'
     
    /* et on peut utiliser strcmp sans risque */
    if (strcmp(reception, "*Hello")) == 0)
    {
        /* faire des choses */
    }

    Merci de votre aide,

  17. #17
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Hello

    On n'est pas devin alors restons sérieux et calme....

    Envoie-nous le message d'erreur et le code entier...
    Bien le bonjour chez vous
    Jowo

  18. #18
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    .... erreur de syntaxe en pointant BYTE ?
    Parce que tu as oublié d'inclure generic_typedefs.h ???
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  19. #19
    Invité(e)
    Invité(e)
    Par défaut
    Parce que BYTE est défini plusieurs fois ?

  20. #20
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    si je declare en tout début de programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char reception[64];
    BYTE size;

    et ensuite je place dans ma boucle infinie le code que vous m'avez écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /* on récupère la trame */
    size = ReadStringUART((BYTE *)reception, sizeof reception - 1);
     
    /* on fait en sorte que reception devienne une chaine de caractères valide */
    reception[size] = '\0'
     
    /* et on peut utiliser strcmp sans risque */
    if (strcmp(reception, "*Hello")) == 0)
    {
        /* faire des choses */
    				OUT1 = 1;
    }
    le compilateur m'indique main.c:2711:Error: syntax error

    la ligne 2711 est un commentaire, c'est pour cela que je pensai a une mauvaise déclaration ( ce n'etait qu'une idée ... )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /* et on peut utiliser strcmp sans risque */
    parfois lorsque le compilateur pointe une ligne donnée pour une erreur de syntaxe, le pb se situe dans la ligne précédente, ici il s'agirait de :


Discussions similaires

  1. Comment attendre une trame sur le port série ?
    Par petitclem dans le forum C++
    Réponses: 55
    Dernier message: 17/07/2008, 10h16
  2. Réponses: 0
    Dernier message: 24/06/2008, 16h12
  3. affecter une adresse ip sur chaque port du switch
    Par blagapart dans le forum Développement
    Réponses: 1
    Dernier message: 08/08/2005, 18h42
  4. Afficher une texture "pleine" sur un support non c
    Par Mastero dans le forum DirectX
    Réponses: 20
    Dernier message: 27/01/2005, 13h28
  5. afficher une ligne contante sur le graphe d'un DBChart ?
    Par bigfoot dans le forum Bases de données
    Réponses: 5
    Dernier message: 23/12/2004, 16h33

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