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 :

espionnage port serie


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 34
    Par défaut espionnage port serie
    Bonjour, je dois scrupter un port série en permanence pour pouvoir arrêter un pc des qu'il reçoit une info sur le port série. Cette info est la suivante : POWER OFF! qui se repete indefiniement pendant une tempo de 30s. J'ai fait un programme en c++ qui marche juste lorsque j'envoie POWER OFF! via hyperterminal. Mais des que je lui envoie deux "POWER OFF!POWER OFF!" la comparaison des deux chaines ne marche pas. Si quelqu'un peut m'aider car je suis pas un pro dans le domaine de la programmation en C++. D'avance merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 34
    Par défaut
    Citation Envoyé par chris83160 Voir le message
    Bonjour, je dois scrupter un port série en permanence pour pouvoir arrêter un pc des qu'il reçoit une info sur le port série. Cette info est la suivante : POWER OFF! qui se repete indefiniement pendant une tempo de 30s. J'ai fait un programme en c++ qui marche juste lorsque j'envoie POWER OFF! via hyperterminal. Mais des que je lui envoie deux "POWER OFF!POWER OFF!" la comparaison des deux chaines ne marche pas. Si quelqu'un peut m'aider car je suis pas un pro dans le domaine de la programmation en C++. D'avance merci
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    int main () 
    {     
             char ChaineRecueTmp[32] ;
             char ChaineRecue[32] ;
             int nbMaxCar = 10 ;
             int nbCarRecus ;
             short MessageRecu = FALSE ;
     
             memset (ChaineRecueTmp, '\0',32);
             memset (ChaineRecue, '\0',32);
     
             if ( OuvrirCom("COM1", 19200, 8, "Aucune", 1 ) ){
                printf("\n Ouverture du port effectuee.\n") ;
             }
             else{
                printf("\n Erreur ouverture port.\n") ;
             }
     
             while (!MessageRecu){
                   sleep (5000);
                   if ( RecevoirCom(ChaineRecueTmp, nbMaxCar, &nbCarRecus ) ) {
                      if ( nbCarRecus != 0 ){
                         printf (" Trame recue correctement.\n") ;
                         //strncat (ChaineRecue, ChaineRecueTmp, 10);
                         if (strcmp (ChaineRecue, "POWER OFF!") == 0 )
                            { 
                            system("shutdown -s -f -t 30");
                            return EXIT_SUCCESS;
                            }
                         else {
                            printf (" Erreur comparaison avec POWER OFF!: %s\n",ChaineRecue) ;             
                            }
                         }
                      else {   
                         printf (" nbCarRecus : %d\n",&nbCarRecus) ;             
                         }
                      }
             } //Fin du While   
    } //Fin du main

  3. #3
    Membre éprouvé
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 121
    Par défaut
    Bonjour,

    le comportement est normal a mon sens

    quand tu envoies POWER_OFF!POWER_OFF!

    c'est la chaine qui va etre comparée avec strcmp

    et forcément POWER_OFF!POWER_OFF! != POWER_OFF!

    Essais plutot avec strstr qui va vérifier qu'une chaine se trouve dans l'autre.

    http://www.cplusplus.com/reference/c...string/strstr/

    Cordialement

  4. #4
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Citation Envoyé par Lharuun Voir le message
    Bonjour,

    le comportement est normal a mon sens

    quand tu envoies POWER_OFF!POWER_OFF!

    c'est la chaine qui va etre comparée avec strcmp

    et forcément POWER_OFF!POWER_OFF! != POWER_OFF!

    Essais plutot avec strstr qui va vérifier qu'une chaine se trouve dans l'autre.
    [Petite anecdote] Sous réserve que la chaine soit délimitée par un 0; ce qui est rarement le cas quand on traite des données issues d'un buffer binaire (le port série en l'occurrence).
    Sauf si l'expéditeur pense à envoyer le délimiteur, il faut le mettre à la main pour pouvoir manipuler les données sous forme d'une chaine de caractères. [/anecdote]

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 34
    Par défaut
    Merci je ne connaissais pas cette commande. Mais elle fait reference a des pointeurs et moi je veux juste comparer un "serie" de caracteres. Je ne vois pas comment modifier mon programme ou mes variables pour arriver a ca, merci de votre aide..

  6. #6
    Membre éprouvé
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 121
    Par défaut
    Bonjour,

    Mais tu sais que quand tu passes ta chaine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char ChaineRecue[32] ;
    a strcmp, il y a plus que de "très fortes" chances que le prototype de la fonction soit plutot du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int strcmp(char *ch1,char *ch2) 
     
    et non pas 
     
    int strcmp(char ch1[32],char ch2[32])
    D'ailleru quand tu fais strcmp(ChaineRecue,"POWER_OFF!")

    ChaineRecue est en fait un pointeur dans le cas des tableau.
    ce qui explique que tu puisses accéder a un caractère de ton tableau des façons suivante :
    ChaineRecue[0] == *ChaineRecue
    ChaineRecue[1] == *(ChaineRecue+1)
    et ainsi de suite

    ChaineRecue est en fait un pointeur sur le premier élément de ton tableau.

    Par contre, pour reprendre l'anecdote, il faut bien faire attention a avoir le '\0' apres le dernier caractere de tes chaines de caractere, sinon risque de SEGFAULT

    Si tu fais du C assez souvent, je ne saurais que te conseiller fortement de lire un peu de littérature a propos des pointeurs, c'est assez utile.

    cherche un peut du côté de strstr : RTFM man strstr
    C'est pas bien compliqué.
    Cordialement

    cordialement

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 34
    Par défaut
    ok, donc si je te suis bien dans " l'anecdote" comme je recois non stop" POWER OFF! POWER OFF! POWER OFF!......"il n'y a jamais ce \0.
    J'ai mis ds mon code ceci
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    int main () 
    {     
             char ChaineRecueTmp[32] ;
             char ChaineRecue[32] ;
             int nbMaxCar = 10 ;
             int nbCarRecus ;
             short MessageRecu = FALSE ;
     
             memset (ChaineRecueTmp, '\0',32);
             memset (ChaineRecue, '\0',32);
     
             if ( OuvrirCom("COM1", 19200, 8, "Aucune", 1 ) )
             {
                printf("\n Ouverture du port effectuee.\n") ;
             }
             else{
                printf("\n Erreur ouverture port.\n") ;
             }
     
             while (!MessageRecu)
             {
                   sleep (5000);
                   if ( RecevoirCom(ChaineRecueTmp, nbMaxCar, &nbCarRecus ) ) 
                   {
                      if ( nbCarRecus != 0 )
                      {
                         printf (" Trame recue correctement.\n") ;
                         //if (strncmp (ChaineRecue, "POWER OFF!" ,10) == 0 )
                          if (strstr(ChaineRecue, "POWER OFF!")!=NULL)
                           {
                            system("shutdown -s -f -t 30");
                            return EXIT_SUCCESS;

    Mais helas pas plus de succes j'ai toujours une difference de comparaison...je comprends pas pourquoi!!!

  8. #8
    Membre éprouvé
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 121
    Par défaut
    Bonjour,

    Quand tu as reçu ta sequence, est ce que tu peux faire un printf histoire de voir
    ce que tu as dans ChaineRecue juste comme ca ?

  9. #9
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Pour info :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int foo(char *ch1,char *ch2) 
    //et
    int foo(char ch1[32],char ch2[32]) 
    //et
    int foo(char ch1[],char ch2[])
    Sont strictement équivalents (dans le sens absolu du terme équivalents).
    Les [32] et [ ] sont trompeurs, ils laisseraient croire qu'on a déclaré deux arguments de types char[32] ou char[ ]; mais en fait il s'agit de deux char*.

    De même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ChaineRecue[n]
    //et
    *(ChaineRecue+n)
    Sont garantis être équivalents (par la norme).


    Pour revenir à \0, c'est bien la fonction "RecevoirCom" qui devrait s'en charger. Elle devrait le placer manuellement à la fin de la réception, et éventuellement vérifier que le buffer de réception est assez large pour contenir les nouvelles données reçues.

    Il faudrait s'assurer que les configurations du port COM sont identiques au niveau de la machine qui envoie et celle qui reçoit (baude rate, parité, nb de bits, bits de stop, éventuellement le contrôle de flux). Tu peux dans un premier temps t'aider d'un terminal RS232 (hyper terminal pour windows) pour vérifier que la machine reçoit bien ce qui a été envoyé, et sous sa bonne forme.

    Ensuite, peux-tu si possible, afficher la valeur de "nbCarRecus" après une réception ?

  10. #10
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Et ça marche, ou pas avec le strncmp que tu as commenté ?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    en C++, pour comparer des strings, on utilise l'opérateur ==

    De plus, la fonction membre find() te permets de trouver l'occurence d'une string dans une autre.

    Je pense qu'en C++ il vaut mieux utiliser les strings que les char* (qui sont plus pour du C)

    Ca ne répond certes pas à ta question, mais cela peut t'éviter des erreurs du genre '\0', ou '\n' etc...

Discussions similaires

  1. quel est le Meilleur language pour piloter le port serie ?
    Par flyfab dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 21/07/2003, 10h03
  2. Lire le fichier du port série
    Par saibe dans le forum Linux
    Réponses: 7
    Dernier message: 09/04/2003, 09h29
  3. Réponses: 5
    Dernier message: 25/03/2003, 19h43
  4. [TP] port série rs232
    Par cyb33 dans le forum Turbo Pascal
    Réponses: 44
    Dernier message: 13/01/2003, 15h49
  5. [Kylix] Kylix / port serie
    Par Anonymous dans le forum EDI
    Réponses: 3
    Dernier message: 01/04/2002, 12h07

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