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
|
#define TAILLE_INBUFFER 5
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winbase.h>
#include <conio.h>
#include <string.h>
#include "Struct_TrameSending.h"
#include"Struct_Conf.h"
#include "DumpHex.h"
int main(void)
{
DCB dcb;
HANDLE hCom;
BOOL fSuccess; // Tout ess bien passé
char *chaine=NULL;
unsigned long nBytesWrite;
COMMTIMEOUTS tTimeout;
int TimeoutRead;
unsigned long nBytesRead=0;
char *inBuffer=NULL;
inBuffer=malloc(15);
char *message;
message=malloc(5);
char *msg;
msg=malloc(5);
struct TrameSending S={0x52, 0x10,0xFF,0xFF,0xFF }; //trame que je veux envoyer est de cette forme
struct Conf_Comm Conf={"\\\\.\\COM50", "Aucune","9600","8","1" }; //port, parité, baudrate..
//Ouverture du port Comm
hCom= CreateFile ( Conf.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());
}
//Lecture de configuration actuelle
fSuccess = GetCommState (hCom, &dcb);
if (!fSuccess)
{
//Manipuler l'erreur
printf("GetCommState failed with error %d\n", GetLastError());
}
//Configuration du port
dcb.BaudRate= atoi(Conf.Vitesse); // gestion de vitesse . atoi:Convertir String to integer
dcb.ByteSize= atoi(Conf.TailleData); //gestion de la taille
//Gestion de la partité
if (strcmp (Conf.Parite, "Aucune")==0) //strcmp : si égaux renvoie 0
dcb.Parity=NOPARITY; // pas de parité
if (strcmp (Conf.Parite, "Paire")==0)
dcb.Parity=EVENPARITY;
if (strcmp (Conf.Parite, "Impaire")==0)
dcb.Parity=ODDPARITY;
//Gestion bit de Stop
if (strcmp (Conf.StopBit, "1")==0)
dcb.StopBits= ONESTOPBIT; // 1 bit stop
if (strcmp (Conf.StopBit, "1.5")==0)
dcb.StopBits= ONE5STOPBITS; // 1.5 bit stop
if (strcmp (Conf.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());
}
else
{
printf("périphérique initialisé correctement \n");
}
sprintf(message, "%c", S.c1);
sprintf(message, "%s%c", message, S.c2);
sprintf(message, "%s%c", message, S.c3);
sprintf(message, "%s%c", message, S.c4);
sprintf(message, "%s%c", message, S.crc);
//Ecrire dans le fichier
fSuccess=WriteFile(hCom,message, 5, &nBytesWrite, NULL);
if (!fSuccess)
{
//Manipuler l'erreur
printf("WriteFile failed with error %d\n", GetLastError());
}
else
{
printf("Ecriture correcte \n");
}
free(message);
fSuccess = GetCommTimeouts(hCom, &dcb);
if (!fSuccess)
{
//Manipuler l'erreur
printf("GetCommTimeouts failed with error %d\n", GetLastError());
}
//Définition des timeouts
TimeoutRead= 700; // timeout de 1000ms
tTimeout.ReadIntervalTimeout= MAXWORD;
tTimeout.ReadTotalTimeoutMultiplier=0;
tTimeout.ReadTotalTimeoutConstant=TimeoutRead;
tTimeout.WriteTotalTimeoutMultiplier=0;
tTimeout.WriteTotalTimeoutConstant=0;
//Configuration du Timeout
fSuccess = SetCommTimeouts(hCom, &tTimeout);
if (!fSuccess)
{
//Manipuler l'erreur
printf("SetCommTimeouts failed with error %d\n", GetLastError());
}
fSuccess=ReadFile(hCom, inBuffer, 5, &nBytesRead, NULL);
if (!fSuccess)
{
//Manipuler l'erreur
printf("ReadFile failed with error %d\n", GetLastError());
}
else if (nBytesRead==0) // pas des octets lus
printf("pas de chaine reçue \n");
else if(memchr(inBuffer, '\0', TAILLE_INBUFFER)!=NULL && strlen(inBuffer) == nBytesRead-1) //Reçu une chaîne de caractères valide et complète
{
printf("chaine recue est: %s\n", inBuffer); //Afficher la chaîne reçue.
}
else
{
printf("Donnees recues (pas une chaine): \n \n" );
DumpHexa(inBuffer, nBytesRead,msg);
printf(" %010X \n", msg);
}
//fermer le port
CloseHandle(hCom);
//Libérer la mémoire
free(inBuffer);
return (fSuccess);
} |
Partager