Upload
zanthe
View
41
Download
0
Embed Size (px)
DESCRIPTION
Essai ligne série CEPC. Application écho sur COM1 Présentation. Objectif. Utiliser la ligne série de la plate-forme CEPC avec les logiciels fournis en standard par Windows CE Configurer le port série. Programme à réaliser. Faire un programme d’écho sur le deuxième port de communication - PowerPoint PPT Presentation
Citation preview
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 1
Essai ligne série CEPC
Application écho sur COM1
Présentation
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 2
Objectif
• Utiliser la ligne série de la plate-forme CEPC avec les logiciels fournis en standard par Windows CE
• Configurer le port série
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 3
Programme à réaliser
• Faire un programme d’écho sur le deuxième port de communication
• Comme le premier port est pris pour le debugging, le premier port utilisable par une application est le deuxième, traditionnellement appelé COM2. En tant que premier port libre, il va s’appeler COM1 dans notre application.
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 4
Plan de travail
• Faire une plate-forme vierge : z_COM• Préparation de l’application ESSAI_COM1
– Ouverture d’un port série– Modification de la configuration du port– Installation des événements de communication– Écriture d’une boucle d’essai– Fermeture de l’application
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 5
File → New Project or File
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 6
Application ESSAI_COM1 (1)
Nommer
Valider
Choisir
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 7
Application ESSAI_COM1 (2)
Choisir
Valider
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 8
Après création du projet
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 9
Configuration Platform → Settings
ValiderChoisirChoisir
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 10
Utilisation du port série standard
• Ouvrir le port série par la fonction CreateFile et lui attribuer un nom, par exemple COM1
• Le port est configuré à partir d’informations regroupées dans une structure nommée DCB
• DCB est définie par un typedef dans winbase.h• Constantes définies par des #define dans
winbase.h• Accès aux paramètres du port
– Lecture : GetCommState– Écriture : SetCommState
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 11
Constantes (1)
// DTR Control Flow Values.
#define DTR_CONTROL_DISABLE 0x00
#define DTR_CONTROL_ENABLE 0x01
#define DTR_CONTROL_HANDSHAKE 0x02
// RTS Control Flow Values
#define RTS_CONTROL_DISABLE 0x00
#define RTS_CONTROL_ENABLE 0x01
#define RTS_CONTROL_HANDSHAKE 0x02
#define RTS_CONTROL_TOGGLE 0x03
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 12
Constantes (2)
#define NOPARITY 0#define ODDPARITY 1#define EVENPARITY 2#define MARKPARITY 3#define SPACEPARITY 4
#define ONESTOPBIT 0#define ONE5STOPBITS 1#define TWOSTOPBITS 2
#define IGNORE 0 // Ignore signal
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 13
DCB (1)
typedef struct _DCB{DWORD DCBlength; // longueur de la structureDWORD BaudRate; // vitesse de transmissionDWORD fBinary:1; // TRUE: no EOFDWORD fParity:1; // FALSE: no parityDWORD fOutxCtsFlow:1; // FALSE: no CTSDWORD fOutxDsrFlow:1; // FALSE: no DSRDWORD fDtrControl:2; // DTR_CONTROL_DISABLEDWORD fDsrSensitivity:1; // FALSE: no DSR sensitiveDWORD fTXContinueOnXoff:1; // TRUE: Continue
// TX when Xoff sentDWORD fOutX:1; // FALSE: no XON/XOFF
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 14
DCB (2)
DWORD fInX:1; // FALSE: no XON/XOFF DWORD fErrorChar:1; // FALSE: no error replacementDWORD fNull:1; // FALSE: no null bytes discardedDWORD fRtsControl:2; // RTS_CONTROL_DISABLEDWORD fAbortOnError:1; // FALSE: no error abortDWORD fDummy2:17; // ReservedWORD wReserved; // must be 0WORD XonLim; // Flow control default valueWORD XoffLim; // Flow control default valueBYTE ByteSize; // 8 bitsBYTE Parity; // 0: non parityBYTE StopBits; // 0: one stop bit
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 15
DCB (3)
char XonChar; // Default valuechar XoffChar; // Default valuechar ErrorChar; // Default valuechar EofChar; // Default valuechar EvtChar; // Default valueWORD wReserved1; // Default value
}DCB, *LPDCB;
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 16
Lecture de la configuration du port
BOOL GetCommState( HANDLE hFile, LPDCB lpDCB );
ParametershFile
[in] Handle to the communication device. The CreateFile function returns this handle.
lpDCB [out] Long pointer to the DCB structure in which the control
settings data is returned. Return Values
Nonzero indicates success. Zero indicates failure. To obtain extended error data, call the GetLastError function.
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 17
Écriture de la configuration du port
BOOL SetCommState( HANDLE hFile, LPDCB lpDCB );
Parameters
hFile
[in] Handle to the communications device. The CreateFile function returns this handle.
lpDCB
[in] Long pointer to a DCB structure containing the configuration information for the specified communications device.
Return Values
Nonzero indicates success. Zero indicates failure. To obtain extended error information, call the GetLastError function.
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 18
Écriture de données (1)
BOOL WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped);
Parameters
hFile
[in] Handle to the file to be written to. The file handle must have been created with GENERIC_WRITE access to the file.
lpBuffer
[in] Pointer to the buffer containing the data to write to the file.
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 19
Écriture de données (2)
nNumberOfBytesToWrite [in] Number of bytes to write to the file. A value of zero specifies a null
write operation. A null write operation does not write any bytes but does cause the time stamp to change. WriteFile does not truncate the file. To truncate or extend a file, use the SetEndOfFile function.
lpNumberOfBytesWritten [out] Pointer to the number of bytes written by this function call. WriteFile
sets this value to zero before taking action or checking errors.
lpOverlapped [in] Unsupported; set to NULL.
Return ValuesNonzero indicates success. Zero indicates failure. To get extended
error information, call GetLastError.
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 20
Lecture de données (1)
BOOL ReadFile(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped );
Parameters
hFile
[in] Handle to the file to be read. The file handle must have been created with GENERIC_READ access to the file. This parameter cannot be a socket handle.
lpBuffer
[out] Pointer to the buffer that receives the data read from the file.
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 21
Lecture de données (2)
nNumberOfBytesToRead [in] Number of bytes to be read from the file.
lpNumberOfBytesRead [out] Pointer to the number of bytes read. ReadFile sets this value
to zero before doing taking action or checking errors. lpOverlapped
[in] Unsupported; set to NULL.
Return ValuesNonzero indicates success. Zero indicates failure. To get extended
error information, call GetLastError.
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 22
Événements de communication
• Des événements « EVENTs » ont été définis pour signaler que quelque chose s’est produit : break, signaux MODEM, caractère reçu, transmetteur prêt…
• La lecture sera en attente de l’EVENT caractère reçu : EV_RXCHAR
• La fonction WaitCommEvent permet d’attendre un événement sur le port
• La fonction SetCommMask permet de spécifier la nature de l’événement attendu
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 23
Attente d’EVENT (1)
BOOL WaitCommEvent( HANDLE hFile, LPDWORD lpEvtMask, LPOVERLAPPED lpOverlapped );
Parameters
hFile
[in] Handle to the communications device. The CreateFile function returns this handle.
lpEvtMask
[out] Long pointer to a 32-bit variable that receives a mask indicating the events that occurred. If an error occurs, the value is zero; otherwise, it is one or more of the following values.
Value Description
EV_BREAK A break was detected on input.
…
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 24
Attente d’EVENT (2)
…
EV_RXCHAR A character was received and placed in the input buffer.
…
lpOverlapped
[in] Ignored; set to NULL.
Return Values
Nonzero indicates success. Zero indicates failure. To obtain extended error information, call the GetLastError function
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 25
Choix de l’événement attendu (1)
BOOL SetCommMask( HANDLE hFile, DWORD dwEvtMask );
Parameters
hFile
[in] Handle to the communications device. The CreateFile function returns this handle.
dwEvtMask
[in] Specifies the events to be enabled and immediately signals any thread waiting on the WaitCommEvent function. A value of zero disables all events.
The following table shows possible values for this parameter.Value DescriptionEV_BREAK A break was detected on input.…
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 26
Choix de l’événement attendu (2)
…
EV_RXCHAR A character was received and placed in the input buffer.…
Return Values
Nonzero indicates success. Zero indicates failure. To obtain extended error information, call the GetLastError function.
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 27
Gestion des « Time-out »
• Les « Time-out » sont configurés à partir d’informations regroupées dans une structure nommée COMMTIMEOUTS
• COMMMTIMEOUTS définie par un typedef dans winbase.h
• Accès aux paramètres du port – Lecture : GetCommTimeouts– Écriture : SetCommTimeouts
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 28
Structure COMMTIMEOUTS
• typedef struct _COMMTIMEOUTS{DWORD ReadIntervalTimeout;DWORD ReadTotalTimeoutMultiplier;DWORD ReadTotalTimeoutConstant;DWORD WriteTotalTimeoutMultiplier;DWORD WriteTotalTimeoutConstant;
}COMMTIMEOUTS, *LPCOMMTIMEOUTS;
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 29
Paramètres des Time-out
• Pour la lecture on limite l’overhead en mettant– ReadIntervalTimeout = MAXDWORD; – ReadTotalTimeoutMultiplier = 0; – ReadTotalTimeoutConstant = 0;
• Pour l’écriture on prend une marge de sécurité par rapport a la vitesse de transmission
– WriteTotalTimeoutMultiplier = 10; – WriteTotalTimeoutConstant = 1000;
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 30
Application
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 31
Programme à réaliser
• Application qui utilise le port série COM1• Le programme est très simple, il doit :
– Écrire un $ avec IOCTL_ PUTC– Attendre la réception d’un caractère avec
IOCTL_GETC – Envoyer l’écho avec IOCTL_PUTC– Boucler jusqu’à la réception du caractère ESCAPE
(0x1B)– Se terminer après la réception de ESCAPE
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 32
COM1.cpp (1)
#include "stdafx.h"
int main(int argc,char *argv[],char *envp[])
{
// Déclarations et réservations
HANDLE hPort;
BYTE byte=0;
DWORD dwCom,dwBytes;
DCB PortDCB;
COMMTIMEOUTS CommTimeouts;
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 33
COM1.cpp (2)
// Ouverture du port série
hPort=CreateFile(_T("COM1:"),GENERIC_READ| GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
// Traitement de l'erreur
if(hPort==INVALID_HANDLE_VALUE)
{
printf("Erreur lors de l'ouverture du port\n");
return 0;
}
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 34
COM1.cpp (3)
// Message de bienvenue
printf("Début de ESSAI_COM1.cpp\n");
// Récupération des paramètres du port
if(!GetCommState(hPort,&PortDCB))
{
CloseHandle(hPort);
printf("Erreur lors de GetCommState\n");
return 0;
}
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 35
COM1.cpp (4)
// Modifications des paramètres du port
PortDCB.BaudRate = 9600;
PortDCB.fBinary = TRUE;
PortDCB.fParity = FALSE;
PortDCB.fOutxCtsFlow = FALSE;
PortDCB.fOutxDsrFlow = FALSE;
PortDCB.fDtrControl = DTR_CONTROL_DISABLE;
PortDCB.fDsrSensitivity = FALSE;
PortDCB.fTXContinueOnXoff = TRUE;
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 36
COM1.cpp (5)
PortDCB.fOutX = FALSE;
PortDCB.fInX = FALSE;
PortDCB.fErrorChar = FALSE;
PortDCB.fNull = FALSE;
PortDCB.fRtsControl = RTS_CONTROL_DISABLE;
PortDCB.fAbortOnError = FALSE;
PortDCB.ByteSize = 8;
PortDCB.Parity = NOPARITY;
PortDCB.StopBits = ONESTOPBIT;
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 37
COM1.cpp (6)
// Écriture des nouveaux paramètres du port
if(!SetCommState(hPort,&PortDCB))
{
CloseHandle(hPort);
printf("Erreur lors de SetCommState\n");
return 0;
}
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 38
COM1.cpp (7)
// Lecture des paramètres de time-out if (!GetCommTimeouts(hPort,&CommTimeouts)) { CloseHandle(hPort); printf("Erreur lors de GetCommTimeouts\n"); return 0; }
// Modification des paramètres de time-out CommTimeouts.ReadIntervalTimeout = MAXDWORD; CommTimeouts.ReadTotalTimeoutMultiplier = 0;
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 39
COM1.cpp (8)
CommTimeouts.ReadTotalTimeoutConstant = 0; CommTimeouts.WriteTotalTimeoutMultiplier = 10; CommTimeouts.WriteTotalTimeoutConstant = 1000; // Écriture des nouveaux paramètres de time-out if(!SetCommTimeouts(hPort,&CommTimeouts)) { CloseHandle(hPort); printf("Erreur lors de SetCommTimeouts\n"); return 0; }
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 40
COM1.cpp (9)
// Spécification de l'événement attendu
if(!SetCommMask(hPort,EV_RXCHAR))
{
CloseHandle(hPort);
printf("Erreur lors de SetCommMask\n");
return 0;
}
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 41
COM1.cpp (10)
// Boucle d'écho
while(byte!=0x1B)
{
// Attente de l'événement
if(!WaitCommEvent(hPort,&dwCom,NULL))
{
CloseHandle(hPort);
printf("Erreur lors de WaitCommEven\n");
return 0;
}
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 42
COM1.cpp (11)
// Réarmement de l'événement
if(!SetCommMask(hPort,EV_RXCHAR))
{
CloseHandle(hPort);
printf("Erreur lors de SetCommMask\n");
return 0;
}
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 43
COM1.cpp (12)
// Lecture et écho du caractère
{
ReadFile(hPort,&byte,1,&dwBytes,NULL);
WriteFile(hPort,&byte,1,&dwBytes,NULL);
}
}// Fin while
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 44
COM1.cpp (13)
// Fermeture du handle
CloseHandle(hPort);
printf("Fin de ESSAI_COM1.cpp\n");
return 0;
}// Fin main
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 45
Test
• Télécharger le noyau• Exécuter l’application• Vérifier le fonctionnement
jc/md/lp-01/05 Essai ligne série COM1 : corrigé 46
Conclusion
• Sur un exemple simple, nous avons appris à utiliser des fonctions proposées par Windows CE pour modifier les caractéristiques de fonctionnement d’un périphérique
– Caractéristiques physiques du port– Caractéristiques des événements associés à la
gestion des échanges