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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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