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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    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 éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    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 éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    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, 522 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 éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    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 */
    }

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