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

MFC Discussion :

probleme de communication port série


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 46
    Points : 29
    Points
    29
    Par défaut probleme de communication port série
    Je suis actuellement sur le portage en 32 bits d'une application et je bute sur un problème de communication série. Je suis sur une application qui communique avec un lecteur de carte bancaire. Pour la communication, j'utilise donc l'api win32 avec visual c++ 6. En résumé, la partie qui pose problème concerne la phase de lecture d'infos provenant du lecteur. La phase d'ouverture du port (fonction createfile (....) ) se passe bien. Le problème est au niveau de la lecture (fonction readfile(..)); j'ai essayé de faire fonctionné l'application en mode synchrone, mais elle plante au niveau de la fonction readfile. En mode asynchrone, la fonction retourne False et donc la lecture ne se fait pas mais l'appli ne plante pas. Je ne pense pas avoir fait d'erreur dans l'implémentation des fonctions de l'api win32 et ayant testé diverses solutions sans succès, je suis bloqué sur ce point.
    voici le code (mode asynchrone):
    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
     
    /*-----initialisation des paramètres de comm et ouverture du port--*/
    BOOL mmInitCommMPC10 ()
    {
    HANDLE     RetoOpenComm;
    BOOL       fRetVal;
    DCB        dcb ;
    FILE	*fic;
    char       buffer[100];
    int        l;
    char       *ComNom[] = { "COM1", "COM2", "COM3","COM4","COM5","COM6","COM7","COM8" };
     
        GetPrivateProfileString( "MPC10", "Port", "Com_1", buffer, 100,"PFLS.INI");
        l = 0;
        fic = fopen("cb.txt","a+");
        if (!strcmp(buffer , "Com_1")) l = 0;
        if (!strcmp(buffer , "Com_2")) l = 1;
        if (!strcmp(buffer , "Com_3")) l = 2;
        if (!strcmp(buffer , "Com_4")) l = 3;
        if (!strcmp(buffer , "Com_5")) l = 4;
        if (!strcmp(buffer , "Com_6")) l = 5;
        if (!strcmp(buffer , "Com_7")) l = 6;
        if (!strcmp(buffer , "Com_8")) l = 7;
     
     
    if ((RetoOpenComm = CreateFile( ComNom[l],GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL)) == (HANDLE) -1)
    	{
                        mmCommDevi = FALSE;
    	    return ( FALSE ) ;
    	}
    	else
    	    mmCommDevi = RetoOpenComm;
     
    	/*---------------------	 setup device buffers ----------------*/
    	SetupComm(RetoOpenComm, RXQUEUE, TXQUEUE);
     
    	GetCommState( RetoOpenComm, &dcb ) ;
     
        GetPrivateProfileString( "MPC10", "BaudRate", "9600", buffer, 100,"PFLS.INI");
     
    	dcb.BaudRate = CBR_9600;
     
        if (!strcmp(buffer , "1200")) dcb.BaudRate = CBR_1200;
        if (!strcmp(buffer , "2400")) dcb.BaudRate = CBR_2400;
        if (!strcmp(buffer , "4800")) dcb.BaudRate = CBR_4800;
        if (!strcmp(buffer , "9600")) dcb.BaudRate = CBR_9600;
        if (!strcmp(buffer , "14400")) dcb.BaudRate = CBR_14400;
        if (!strcmp(buffer , "19200")) dcb.BaudRate = CBR_19200;
        if (!strcmp(buffer , "38400")) dcb.BaudRate = CBR_38400;
     
        GetPrivateProfileString( "MPC10", "Parity", "No", buffer, 100,"PFLS.INI");
     
        dcb.Parity =NOPARITY;
        if (!strcmp(buffer , "No")) dcb.Parity = NOPARITY;
        if (!strcmp(buffer , "Even")) dcb.Parity = EVENPARITY;
        if (!strcmp(buffer , "Odd")) dcb.Parity = ODDPARITY;
        if (!strcmp(buffer , "Mark")) dcb.Parity = MARKPARITY;
        if (!strcmp(buffer , "Space")) dcb.Parity = SPACEPARITY;
     
        GetPrivateProfileString( "MPC10", "StopBits", "1", buffer, 100,"PFLS.INI");
        dcb.StopBits = ONESTOPBIT;
        if (!strcmp(buffer , "1")) dcb.StopBits = ONESTOPBIT;
        if (!strcmp(buffer , "1,5")) dcb.StopBits = ONE5STOPBITS;
        if (!strcmp(buffer , "2")) dcb.StopBits = TWOSTOPBITS;
     
       GetPrivateProfileString( "MPC10", "ByteSize", "8", buffer, 100,"PFLS.INI");
        l = 8;
        if (!strcmp(buffer , "8")) l = 8;
        if (!strcmp(buffer , "7")) l = 7;
        dcb.ByteSize = (BYTE) l;
     
        // setup hardware flow control
        dcb.fOutxDsrFlow =(BYTE) 0 ;
        dcb.fDtrControl = 0	
        dcb.fOutxCtsFlow = (BYTE) 0 ;	
        dcb.fRtsControl= RTS_CONTROL_HANDSHAKE;           dcb.fInX = dcb.fOutX = (BYTE) 0 ;
        dcb.XonChar = ASCII_XON ;
        dcb.XoffChar = ASCII_XOFF ;
        dcb.XonLim = 100 ;
        dcb.XoffLim = 100 ;
        // other various settings
        dcb.fBinary = TRUE ;
        dcb.fParity = TRUE ;
     
        fRetVal = SetCommState(mmCommDevi, &dcb ) ;
     
        if (fRetVal<0)
        {
          fclose(fic);
          CloseHandle(mmCommDevi) ;
          return(fRetVal);
        }	
          // assert DTR
        EscapeCommFunction( mmCommDevi, SETDTR ) ; //mmCommDevi ou RetoOpenComm
        fclose(fic);
        return ( fRetVal ) ;
    }
    /*---------fonction de reception ---*/
    BOOL RecoitCharMPC10(char *C)
    {
    char inBuffer[2];
    FILE *fic;
    COMSTAT    ComStat;
    DWORD      dwErrorFlags;
    DWORD      dwNbByteRead=0;
    BOOL Nb;
    DWORD  dwLenght;
    OVERLAPPED osReader= {0}; 	
    int n = 1;
    dwLenght = n;
     
    osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    ClearCommError(mmCommDevi , &dwErrorFlags, &ComStat);
     
    Nb = ReadFile( mmCommDevi, inBuffer, dwLenght, &dwNbByteRead, &osReader );
     
    //	Buffer[dwNbByteRead]=0;
     
    if (Nb == FALSE) 
    {
      return(0);
    }
    *C = inBuffer[0];
    if (MaxTrMPC10 == 1) 
    {
     char BufferTrace[1000];
       switch(*C)
     { 
        case '\0':
    	sprintf(BufferTrace,"Recu ZERO");
    	break;
        case '\x05':
    	sprintf(BufferTrace,"Recu ENQ"); 
    	break;
        case '\x06':
    	sprintf(BufferTrace,"Recu ACK"); 
    	break;
        case '\x15':
    	sprintf(BufferTrace,"Recu NAK"); 
    	break;
        case '\x04' :
    	sprintf(BufferTrace,"Recu EOT");
    	break;
         case '\x02' :
    	sprintf(BufferTrace,"Recu STX");
    	break;
         case '\x03' :
    	sprintf(BufferTrace,"Recu ETX");
    	break;
         case '\x17':
    	sprintf(BufferTrace,"Recu ETB");
    	break;
         case '\x10':
    	sprintf(BufferTrace,"Recu DLE");
    	break;
        default: 
    	sprintf(BufferTrace,"Recu %c",*C);
             }
        }
        return(Nb);
    }
    voila merci d'avance si quelqu'un peut m'aider car la je ne sais plus quoi faire.
    -> débutant <-

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Salut
    quelle type d'erreur pour readfile te retourne le compilo?
    Le pointeur fou...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 46
    Points : 29
    Points
    29
    Par défaut
    en fait la fonction readfile retourne le booléen false(en mode asynchrone).
    -> débutant <-

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut avec la structure Overlapped il faut travailler de cette façon sur le read:
    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
     
    int MCom::ReadBuffer( char *buffer,unsigned int ucount )
    {
        int result;
        COMSTAT comstat;
        DWORD comerr;
        DWORD countread;
        DWORD counttoread;
        struct win_data *w;
     
        w =(struct win_data *) driver;
     
        ClearCommError( w->com_handle, &comerr, &comstat );
        if ( comerr > 0 )
            w->windows_status |= comerr;
     
        if ( comstat.cbInQue > 0 ) {
            if ( comstat.cbInQue < ucount )
                counttoread = comstat.cbInQue;
            else
                counttoread = ucount;
            result = ReadFile( w->com_handle,
                               buffer,
                               (int) counttoread,
                               &countread,&w->ov );
            count = countread;
            if ( result == 0 ) 
    		{
                if ( ( comerr = GetLastError() ) != ERROR_IO_PENDING ) 
    			{
                    ClearCommError( w->com_handle, &comerr, &comstat );
                    ( (struct win_data *) driver )->windows_status |= comerr;
                }
            }
            if ( count < ucount ) 
    		{
                if ( GetOverlappedResult( w->com_handle, &w->ov, &countread, TRUE ) ) 
    			{
                    count = countread;
                    return ( ASSUCCESS );
                } else return ( ASBUFREMPTY );
            }
    		else return( ASSUCCESS );
        } 
    	else
    	{
            count = 0;
            return( ASBUFREMPTY );
        }
    }
    extrait de ma fonction de lecture .

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 46
    Points : 29
    Points
    29
    Par défaut
    je vais essayer le code que tu m'a donné mais à quoi correspondent les ASSUCCESS,ASBUFREMPTY et quel le contenu de la strucure win_data.

    merci.
    -> débutant <-

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    pour ASSUCCESS,ASBUFREMPTY ce sont des defines prives pour ma lib pour indiquer que la lecture s'est bien passe ou que le buffer est vide .
    #define ASSUCCESS 0
    #define ASBUFREMPTY -1
    win_data c'est une structure perso ou je stocke toutes les infos liees à la com en cours : la structure OVERLAPPED ov; le statut d'erreur le handle de com
    etc...


  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    j'oubliais
    pour la structure overlapped à initialiser au debut .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ov.Offset = 0;
    ov.OffsetHigh = 0;
    ov.hEvent=NULL;
    ov.Offset=0;
    faire aussi un
    SetupComm( com_handle, input_buffer_size, output_buffer_size );
    pour fixer la taille des tampons de emission/reception

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 46
    Points : 29
    Points
    29
    Par défaut
    une autre question, les parametres ucount et count correspondend à quoi exactement.

    merci
    -> débutant <-

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    ucount c'est le nb de caractere à lire dans le buffer de reception si on veut lire 1 caractere on fait ReadBuffer( &c,1 ) ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    result = ReadFile( w->com_handle,
                               buffer,
                               (int) counttoread,
                               &countread,&w->ov );
            count = countread;
    count recoit le nb de caracteres lus par Readfile .

Discussions similaires

  1. [VB.net] Probleme de transmition port série
    Par Poisson-Neko dans le forum Windows Forms
    Réponses: 5
    Dernier message: 27/05/2008, 14h21
  2. Communication Port Série Internet
    Par psyckey dans le forum Hardware
    Réponses: 3
    Dernier message: 29/09/2006, 19h37
  3. Réponses: 7
    Dernier message: 09/06/2006, 10h38
  4. [VB6] Probleme communication Port série
    Par Renard-fou dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 15/05/2006, 00h01
  5. Communication port série W2000/W98
    Par Fabsou dans le forum MFC
    Réponses: 4
    Dernier message: 24/10/2005, 19h57

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