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 :

Liaison série et langage C


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 3
    Par défaut Liaison série et langage C
    Bonjour, j'ai du mal à comprendre comment fonctionne une liaison série classique (RS232) :
    Je dispose d'un module externe sur lequel, à son lancement, tourne un programme basique qui écris "hello world" sur la liaison série. Apparemment, la chaîne n'est pas réellement écrite mais mise en file d'attente. Mais je ne comprend pas comment la transmettre effectivement.
    J'ai de l'autre côté un PC disposant d'un programme permettant de lire la liaison série, mais je ne reçois rien lorsque je le lance. Le programme du PC doit-il communiquer au module externe qu'il est prêt à recevoir ou quelque chose dans ce genre?
    Voilà le programme en question (côté PC) :

    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
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    /**Programme de test liaison série RS232*/
    #include <iostream.h>
    #include <iomanip.h>
    #include <windows.h>
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
     
    int initSerial();
    int sendSerial(char *Chaine, char *EolChar);
    int receiveSerial(char *chaineRecue);
     
    char chaine[100];
     
     
     
    /**Initialisation du port série*/
    int initSerial()
    {
        DCB dcb;                //Configuration du port
        HANDLE handleSerial;    //Déclaration handle
        DWORD dwError;          //n° de l’erreur
        BOOL fSuccess;          //Succès de l'opération
     
     
    //Ouverture du port de communication
        handleSerial=CreateFile("COM1",GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
     
     
    //Vérification de l'ouverture du handle
        if (handleSerial==INVALID_HANDLE_VALUE)
        {
            dwError=GetLastError();
        }
     
     
    //Lecture configuration initiale
        fSuccess = GetCommState(handleSerial, &dcb);
        if (!fSuccess)
        {
            printf("Erreur\n");
        }
     
     
    //Configuration du port
    //Gestion de la vitesse
        dcb.BaudRate=CBR_9600;
    //Gestion du nombre de bits
        dcb.ByteSize=8;
    //Gestion de la parité
        dcb.Parity=EVENPARITY;
     
     
    //Gestion du Stop Bit
        dcb.StopBits=ONESTOPBIT;
     
     
        dcb.DCBlength=2048;
        dcb.fBinary=1;
        dcb.fParity=1;
        dcb.fOutxCtsFlow=0;
        dcb.fOutxDsrFlow=0;
        dcb.fDtrControl=0;
        dcb.fDsrSensitivity=0;
        dcb.fTXContinueOnXoff=0;
        dcb.fRtsControl=0;
     
        fSuccess=SetCommState(handleSerial, &dcb);
        if (!fSuccess)
        {
            printf("Erreur\n");
        }
     
     
    //Fermeture du port
        CloseHandle(handleSerial);
        return(fSuccess);
    }
     
     
     
     
     
    /**Programme principal*/
    int main(void)
    {
        int checkInit;
        char *TrameRecue;
        TrameRecue=new char[200];
        checkInit=initSerial();
        /*if(checkInit!=0)
        {
        //Envoi de la chaine test
            char mes[100];
            printf("Saisie chaine :\n");
            gets(mes);
            sendSerial(mes, "end");
        }
        else
        {
        printf("Erreur\n");
        }
    */
        getch();
        char chaineRecue[200];
        printf("Reception :\n");
        receiveSerial(chaineRecue);
        printf("%s ",chaineRecue);
    // Libération mémoire
        delete[] TrameRecue ;
        printf("Fin\n");
    }
     
     
     
    //Réception d'une chaine
    int receiveSerial(char *chaineRecue)
     {
      DCB dcb;
      HANDLE handleSerial;
      DWORD dwError;
      BOOL fSuccess;
      BOOL bResult;
      DWORD dwEvtMask;
      COMMTIMEOUTS tTimeout;
      unsigned long nBytesRead;
      char *inBuffer;
      int TimeoutRead;
      int i;
      int NbOctet;
      char c;
     
     
     
     inBuffer  = new char[200]; // réservation mémoire pour le buffer de récéption
     sprintf(inBuffer,"%s","");
     nBytesRead=0;
     
     
     
     
     handleSerial=CreateFile("COM1",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
     
     
     
     TimeoutRead = 500; // timeout de 500ms
     tTimeout.ReadIntervalTimeout = MAXWORD;
     tTimeout.ReadTotalTimeoutMultiplier = 0;
     tTimeout.ReadTotalTimeoutConstant = TimeoutRead; // pas de time out = 0
     tTimeout.WriteTotalTimeoutMultiplier = 0;
     tTimeout.WriteTotalTimeoutConstant = 0;
     
     
    // configurer le timeout
     SetCommTimeouts(handleSerial,&tTimeout);
     
     
     
      bResult=ReadFile(handleSerial,inBuffer,199,&nBytesRead,NULL);
     
      if (nBytesRead!=0) // Il existe des octets lus
       {
         //rien
       }
     else
      sprintf(inBuffer, "%s" , "Pas de donnee reçue") ;
      sprintf(chaineRecue,"%s",inBuffer); // Retourner la chaine recue
     
    // fermer le port
     CloseHandle(handleSerial);
     
    // Libérer la mémoire
     delete[] inBuffer;
     
     return(fSuccess);
    }

  2. #2
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Par défaut
    Je suppose que ce "module" attaché à ton pc est une UART.

    UART signifie blabla ASYNCHRONOUS blabla(receiver) blabla(tranceiver) ou un truc du style...

    Il est donc fort probable que la réception ce fasse grâce à une interruption ?!

    Dans le pire des cas, tu peux faire la méthode par "scrutation" mais dans ce cas, vu que tu ne sais absolument pas QUAND tu va recevoir tes donnée, je pense qu'il serait mieux de lancer le programme PC avant de démarrer ton module.

    Bonne chance et bonne soirée :p

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    UART : Universal Asynchronous Receiver Transmitter
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 3
    Par défaut
    Je fais tourner le programme côté PC en boucle, puis je mets le module sous tension. Après quelques secondes, une LED s'allume pendant un instant très court sur le module m'indiquant qu'une transmission a lieu par la liaison série. Pourtant, le programme ne détecte rien.
    Autre problème, le programme Hello World présent sur le module devrait boucler (j'ai mis un simple while(1)), mais ne le fait pas. Je ne sais pas exactement comment vous décrire le module vu que je n'y connais pas grand chose, mais il s'agit du MatchPort b/g Pro de Lantronix.

  5. #5
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    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 : 952
    Par défaut
    Salut,

    C'est le module qui envoie quelque chose en premier? Dans ce cas, ouvre un terminal sur ton PC et met le module sous tension pour voir si le terminal reçoit quelque chose. Comme ça tu auras au moins validé le câblage et le protocole. Si cela marche, il sera temps de s'occuper du programme en C. Sinon, il faut résoudre le problème avant de regarder du côté du programme.

    A+

    Pfeuh

  6. #6
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Par défaut
    En effet, comme pfeuh l'a fait remarquer, tu peux te servir du programme Hyper Terminal (je ne sais aucunement si il est présent sur tous les Win XP du marché).

    Après c'est pareil, si tu ne connais pas la config du port série de ton "module" :
    - Bauds rate,
    - parity bit(s),
    - Stop bit(s)...

    Ca va être rude pour toi.

    Mais dans tout les cas, hyper terminal va détecter si quelque chose arrive.

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    C'est souvent 9600 N 8 1

    9600 bauds, 8 bits, pas de parité et 1 bit de stop
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 3
    Par défaut
    C'est bon j'ai réussi à transmettre ce que je voulais, il y avait en fait plusieurs paramètres à régler car la liaison série sur le module est utilisée pour diverses fonctions utilisant des protocoles très différents (tunnel, PPP...), il fallait simplement les prendre en compte.

    La question que je me pose maintenant est comment récupérer sur cette liaison une image compressée en JPEG ? Je me concentre pour le moment simplement sur la lecture de l'image et son stockage dans un buffer, je m'occuperai de la stocker dans un fichier portable plus tard.

    A priori, il faudrait détecter le début de la transmission des données image (par un "ACK" à ce que j'ai cru comprendre), stocker les données octet par octet dans un buffer puis reconstituer l'image dans un tableau de uint8_t, mais c'est tout ce que je sais.
    Quelqu'un a-t-il des précisions à me donner?

  9. #9
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Par défaut
    Beh je suppose que transmettre une image c'est de toute manière transmettre le contenu d'un fichier...

    Focalise toi déjà sur la transmission d'un fichier texte composé d'énormement de ligne (2000/3000) par la puisque ton image contiendra beaucoup plus de donnée que cela.

    En gros tu ouvre ton fichier en "binaire"
    Tu envoyes ton ACK (un ACK est un terme assez générique, c'est en quelque sorte un flag pour signaler que c'est pret)
    Boucle tant que tu peux lire
    -----Tu lit ton image octet/octet ou comme bon te semble
    -----Tu envoy le contenu lu
    Fin boucle
    Envoy un ACK comme quoi tu as fini d'envoyer
    Ferme ton fichier


    Transmission de fichier et/ou de données de toute façon c'est la même chose... tu ne peux que transmettre le CONTENU !


    Amuse toi bien

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Et dans tout cela, comment le recepteur sait il que l'emetteur a fini de tout envoyer et qu'il a un fichier complet.

    Il faut prévoir un "machin" pour que l'emetteur signale au récepteur que c'est fini. Cela peut être :
    • un signal sur le port série
    • la longeur des données à envoyer suivi des données
    • n'importe quel autre moyen pourvu que tout le monde soit d'accord


    En tout cas, il faut le prévoir
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

Discussions similaires

  1. liaison Série avec kernell32
    Par Emcy dans le forum Windows
    Réponses: 8
    Dernier message: 31/08/2005, 08h58
  2. Réponses: 7
    Dernier message: 21/06/2005, 16h56
  3. [Debutant(e)] Liaison série RS232 et servlet
    Par bourack dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 07/01/2005, 14h50
  4. Réponses: 29
    Dernier message: 11/05/2004, 13h18
  5. liaison série
    Par elodie escande dans le forum MFC
    Réponses: 13
    Dernier message: 14/01/2004, 17h57

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