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);
}