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

Réseau C Discussion :

Pb avec fonction strcat ?


Sujet :

Réseau C

  1. #41
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    alors voilà j'ai commencé a codé ma clé de contrôle et ca donne çà :

    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
     /* Lecture de la cle de contrôle */
          CRC_lu=recup_port[i-3]-0x030;
          printf("CRC lu = %d\n",CRC_lu);
     
          /* Calcul de la cle de contrôle */
          for&#40;j=0;j<i-3;j++&#41;&#123;
            somme=somme+recup_port&#91;j&#93;-0x30;
          &#125;
     
          // faut encore calculer ici "CRC_calc" &#58; c'est à dire le complément pour aller a la dizaine supérieur de "somme"
     
          printf&#40;"CRC calc = %d\n",CRC_calc&#41;;
     
          /* Verification de la cle de contrôle */
          if &#40;CRC_calc!=CRC_lu&#41;&#123;
            printf&#40;"Erreur de lecture carte &#58; clé de contrôle invalide\n"&#41;;
            break;
          &#125;

  2. #42
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Voilà c'est fait :

    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
          /* Lecture de la cle de contrôle */
          CRC_lu=recup_port&#91;i-3&#93;-0x030;
          printf&#40;"CRC lu = %d\n",CRC_lu&#41;;
     
          /* Calcul de la cle de contrôle */
          for&#40;j=0;j<i-3;j++&#41;&#123;
            somme=somme+recup_port&#91;j&#93;-0x30;
          &#125;      
          CRC_calc=10-somme % 10;      
          printf&#40;"CRC calc = %d\n",CRC_calc&#41;;
     
          /* Verification de la cle de contrôle */
          if &#40;CRC_calc!=CRC_lu&#41;&#123;
            printf&#40;"Erreur de lecture carte &#58; clé de contrôle invalide\n"&#41;;
            break;
          &#125;
    Ca vous parait bon ?

  3. #43
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    J'aurais une tendance à faire 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
          /* Lecture de la cle de contrôle */
          CRC_lu=recup_port&#91;i-3&#93;-'0';
          printf&#40;"CRC lu = %d\n",CRC_lu&#41;;
     
          /* Calcul de la cle de contrôle */
          somme = 0;
          for&#40;j=0;j<i-3;j++&#41;&#123;
            somme+=recup_port&#91;j&#93;-'0';
          &#125;      
          CRC_calc=10 - &#40;somme % 10&#41;;      
          printf&#40;"CRC calc = %d\n",CRC_calc&#41;;
     
          /* Verification de la cle de contrôle */
          if &#40;CRC_calc!=CRC_lu&#41;&#123;
            printf&#40;"Erreur de lecture carte &#58; clé de contrôle invalide\n"&#41;;
            break;
          &#125;
    Je suis très mauvais dans ma connaissance du code ASCII...
    C'est peut-être parce qu'il ne faut jamais sans servir directement...

    Jc

  4. #44
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par fearyourself
    J'aurais une tendance à faire 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
          /* Lecture de la cle de contrôle */
          CRC_lu=recup_port&#91;i-3&#93;-'0';
          printf&#40;"CRC lu = %d\n",CRC_lu&#41;;
     
          /* Calcul de la cle de contrôle */
          somme = 0;
          for&#40;j=0;j<i-3;j++&#41;&#123;
            somme+=recup_port&#91;j&#93;-'0';
          &#125;      
          CRC_calc=10 - &#40;somme % 10&#41;;      
          printf&#40;"CRC calc = %d\n",CRC_calc&#41;;
     
          /* Verification de la cle de contrôle */
          if &#40;CRC_calc!=CRC_lu&#41;&#123;
            printf&#40;"Erreur de lecture carte &#58; clé de contrôle invalide\n"&#41;;
            break;
          &#125;
    Je suis très mauvais dans ma connaissance du code ASCII...
    C'est peut-être parce qu'il ne faut jamais sans servir directement...

    Jc
    Et bien c'est la même chose : '0' ou 0x30 revient au même puisque le code de '0' est 0x30
    En tout les cas le résultat est le même.

    Ha et pi pour le some=0 je l'avait mis mais dans mes déclarations plus haut j'avais juste oublié de le précisé dans le code que j'ai communiqué ici.

  5. #45
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Bon voilà le prog finale :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    #include <termios.h>     /*  port série  */
    #include <sys/types.h>   /*    socket    */
    #include <sys/socket.h>  /*    socket    */
    #include <netinet/in.h>  /*    socket    */
    #include <arpa/inet.h>   /*    socket    */
    #include <netdb.h>       /*    socket    */
    #include <sys/fcntl.h>   /*    open&#40;&#41;    */
    #include <unistd.h>      /*    close&#40;&#41;   */
    #include <stdio.h>       /* lib standard */ 
     
    #define IP_SERVEUR "10.57.70.2"
    #define PORT_SERVEUR 1500
    #define PORT "/dev/ttyS0"
    #define NUM_SITE "1"
    #define NUM_TERM "1"
     
    #define FALSE 0
    #define TRUE 1
     
    int main &#40;&#41; &#123;
     
      int stop=FALSE;
      int fd;
      int i,j,num_int,somme,CRC_calc,CRC_lu;
      char recup_port&#91;30&#93;,num_str&#91;30&#93;;
      char c;
      struct termios  termios_p;
     
      /* Ouverture de la liaison série */
      fd = open&#40;PORT, O_RDWR | O_NOCTTY&#41;;
      if &#40;fd <0&#41; &#123;perror&#40;PORT&#41;; exit&#40;-1&#41;; &#125;
     
      /*********************   Configuration du port serie   *********************/
      /* Lecture des parametres courants */                                      //
      tcgetattr&#40;fd,&termios_p&#41;;                                                  //
      /* On ignore les BREAK et les caracteres avec erreurs de parite */         //
      termios_p.c_iflag = IGNBRK | IGNPAR;                                       //
      /* Pas de mode de sortie particulier */                                    //
      termios_p.c_oflag = 0;                                                     //
      /* Liaison a 9600 bps avec 8 bits de donnees et une parite paire */        // 
      termios_p.c_cflag = B9600 | CS8 | CLOCAL | CREAD;                          //
      /* Mode non-canonique avec echo */                                         // 
      termios_p.c_lflag = ECHO;                                                  //
      /* Caractères immediatement disponibles */                                 //
      termios_p.c_cc&#91;VMIN&#93; = 1;                                                  //
      termios_p.c_cc&#91;VTIME&#93; = 0;                                                 //
      /* Sauvegarde des nouveaux parametres */                                   //
      tcsetattr&#40;fd,TCSANOW,&termios_p&#41;;                                          //
      /***************************************************************************/
     
      /* Boucle de lecture du port */
      while&#40;stop==FALSE&#41;&#123;
     
        /* Vide le buffer */
        tcflush&#40;fd, TCIFLUSH&#41;;
     
        /* Initialise le caractère et le compteur de caractère */
        c='\0';
        i=0;
     
        while&#40;&#40;c!=0x0a&#41; & &#40;stop==FALSE&#41;&#41;&#123;
          /* Récupère un caractère */
          read&#40;fd, &c, 1&#41;;
          printf&#40;"%c\n",c&#41;;
     
          /* Concatène le caractère dans le string recup_port */
          recup_port&#91;i&#93;=c;
          i++;
     
          if &#40;i>sizeof&#40;recup_port&#41;-1&#41;&#123;
            printf&#40;"Erreur de lecture carte &#58; trop de caractère\n"&#41;;
            stop=TRUE;
          &#125;
        &#125;
     
        if &#40;!stop&#41;&#123;
          /* Ajoute le 0 de fin de chaîne */
          recup_port&#91;i&#93;=0;
     
          /* Récupère le numéro de carte au format entier */
          strncpy&#40;num_str,recup_port,i-3&#41;;
          num_int=atoi&#40;num_str&#41;;
          printf&#40;"Numéro de carte = %d\n",num_int&#41;;      
     
          /*************************  Clé de Contrôle  *************************/
          /* Lecture de la clé de contrôle */                                  //
          CRC_lu=recup_port&#91;i-3&#93;-'0';                                          //
          printf&#40;"CRC lu = %d\n",CRC_lu&#41;;                                      //
                                                                               //
          /* Calcul de la clé de contrôle */                                   //
          somme=0;                                                             //
          for&#40;j=0;j<i-3;j++&#41;&#123;                                                  //
            somme+=recup_port&#91;j&#93;-'0';                                          //
          &#125;                                                                    //
          CRC_calc=10-&#40;somme % 10&#41;;                                            //
          printf&#40;"CRC calc = %d\n",CRC_calc&#41;;                                  //
                                                                               //
          /* Vérification de la clé de contrôle */                             //
          if &#40;CRC_calc!=CRC_lu&#41;&#123;                                               //
            printf&#40;"Erreur de lecture carte &#58; clé de contrôle invalide\n"&#41;;    //
            break;                                                             //
          &#125;                                                                    //
          else&#123;                                                                //
            printf&#40;"CRC vérifié\n"&#41;;                                           //
          &#125;                                                                    //
          /*********************************************************************/
     
          /* Tempo &#58; évite d'endormir le programme de lecture sur la même carte */
          sleep&#40;2&#41;;
        &#125;
      &#125;
     
    /* Fermeture de la liaion serie */
    close&#40;fd&#41;;   
     
    return 0;
     
    &#125;
    Alors maintenant je vais essayer d'ajouter une gestion de timeout sur le read.

    Je pense qu'il faut que j'utilise le VTIME du termios et le retour du read.

    Votre avis, des conseils ?

Discussions similaires

  1. Erreur avec la fonction strcat
    Par pascal1 dans le forum Débuter
    Réponses: 2
    Dernier message: 04/08/2009, 17h48
  2. Problème avec la fonction strcat
    Par saddamtohmto dans le forum MATLAB
    Réponses: 10
    Dernier message: 18/07/2007, 08h57
  3. Problème avec la fonction Strcat
    Par totoc1001 dans le forum MATLAB
    Réponses: 6
    Dernier message: 29/01/2007, 22h34
  4. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 21h42
  5. [VStudio 6] pb avec fonctions dans une DLL
    Par MogDeChNord dans le forum MFC
    Réponses: 8
    Dernier message: 08/01/2004, 09h57

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