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 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
|
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winbase.h>
#include <conio.h>
#include <string.h>
void main(void)
{
int Erreur;
Erreur = InitCom("\\\\.\\COM50", "Aucune", "9600", "8", "1");
if (Erreur!=0) //périphérique initialisé correctement
{
printf("périphérique initialisé correctement \n");
//Envoie de la chaine
EnvoiChainePort("82 FF FF FF", "\\\\.\\COM50");
// recevoir le chaine lus
RecevoirPort ("\\\\.\\COM50");
}
else
{
printf("Erreur lors de la configuration %d. \n", GetLastError());
}
}
/*Configuration du port série */
int InitCom( char *pcCommPort, char *Parite, char *Vitesse, char *TailleData, char *StopBit)
{
//Initialisation
DCB dcb;
HANDLE hCom;
BOOL fSuccess; // Tout est bien passé
//Ouverture du port Comm
hCom= CreateFile ( pcCommPort,
GENERIC_READ|GENERIC_WRITE, //accés lecture/ecriture
0, //pas de partage possible du port une fois ouvert
NULL, //pas d'héritage
OPEN_EXISTING, //doit etre open_existing
0, // pas d'overlopped I/O
NULL //hTemplate doit etre null
);
// Vérifier si handle ouvre correctement
if (hCom ==INVALID_HANDLE_VALUE)
{
//Manipuler l'erreur
printf("Create file failed with error %d\n", GetLastError());
return (1);
}
//Lecture de configuration initiale
fSuccess = GetCommState (hCom, &dcb);
if (!fSuccess)
{
//Manipuler l'erreur
printf("GetCommState failed with error %d\n", GetLastError());
return (2);
}
//Configuration du port
dcb.BaudRate= atoi(Vitesse); // gestion de vitesse . atoi:Convertir String to integer
dcb.ByteSize= atoi(TailleData); //gestion de la taille
/*Gestion de la partité*/
if (strcmp (Parite, "Aucune")==0) //strcmp : si égaux renvoie 0
dcb.Parity=NOPARITY; // pas de parité
if (strcmp (Parite, "Paire")==0)
dcb.Parity=EVENPARITY;
if (strcmp (Parite, "Impaire")==0)
dcb.Parity=ODDPARITY;
/* Gestion bit de Stop*/
if (strcmp (StopBit, "1")==0)
dcb.StopBits= ONESTOPBIT; // 1 bit stop
if (strcmp (StopBit, "1.5")==0)
dcb.StopBits= ONE5STOPBITS; // 1.5 bit stop
if (strcmp (StopBit, "2")==0)
dcb.StopBits= TWOSTOPBITS; // 2 bit stop
//Configurer le port
fSuccess = SetCommState(hCom, &dcb);
if (!fSuccess)
{
//Manipuler l'erreur
printf("SetCommState failed with error %d\n", GetLastError());
return (3);
}
//Fermer le port
CloseHandle(hCom);
return (fSuccess);
}
/*Ecriture sur un port série */
int EnvoiChainePort(char *chaine, char *pcCommPort)
{
HANDLE hCom;
BOOL fSuccess;
int NbOctet;
unsigned long nBytesWrite;
// Ouverture du port de communication
hCom= CreateFile ( pcCommPort,
GENERIC_READ|GENERIC_WRITE, //accés lecture/ecriture
0, //pas de partage possible du port une fois ouvert
NULL, //pas d'héritage
OPEN_EXISTING, //doit etre open_existing
0, // pas d'overlopped I/O
NULL //hTemplate doit etre null
);
NbOctet= strlen(chaine);
//Ecrire dans le fichier
WriteFile(hCom,chaine, 4, &nBytesWrite, NULL);
//Fermer le handle de Com
CloseHandle(hCom);
return fSuccess;
}
/* Lecture sur un port série */
BOOL RecevoirPort (char *pcCommPort)
{
DCB dcb;
HANDLE hCom;
BOOL fSuccess;
BOOL bResult;
COMMTIMEOUTS tTimeout;
char *inBuffer="NULL";
int TimeoutRead;
unsigned long nBytesRead;
// Initialisation des variables
inBuffer= malloc(200); // Réservation mémoire pour le buffer de récéption
nBytesRead=0;
// Ouverture du port de communication
hCom= CreateFile ( pcCommPort,
GENERIC_READ|GENERIC_WRITE, //accés lecture/ecriture
0, //pas de partage possible du port une fois ouvert
NULL, //pas d'héritage
OPEN_EXISTING, //doit etre open_existing
0, // pas d'overlopped I/O
NULL //hTemplate doit etre null
);
//Définition des timeouts
TimeoutRead=500; // timeout de 1000ms
tTimeout.ReadIntervalTimeout= MAXWORD;
tTimeout.ReadTotalTimeoutMultiplier=0;
tTimeout.ReadTotalTimeoutConstant=TimeoutRead;
tTimeout.WriteTotalTimeoutMultiplier=0;
tTimeout.WriteTotalTimeoutConstant=0;
//Configuration du Timeout
SetCommTimeouts(hCom, &tTimeout);
/* Boucle d'attente de lecture des octets */
bResult=ReadFile(hCom, inBuffer, 4096, &nBytesRead, NULL); //4096: maximum of bytes to be read
if (nBytesRead<=0) // pas des octets lus
printf("Buffer est vide: %s", inBuffer);
else
printf(" Chaine reçue est : %s", inBuffer); //Retourner la choine reçue.
//fermer le port
CloseHandle(hCom);
//Libérer la mémoire
free(inBuffer);
return (fSuccess);
} |
Partager