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.