Accueil > > > BASE COMMUNICATION SÉRIE RS232 (WIN32)
BASE COMMUNICATION SÉRIE RS232 (WIN32)
Information sur la source
Description
après plusieures questions et demandes d'aides, voici le minimum vital pour lire et écrire sur les ports séries. le handle du port est mis en variable globale (g_hComm). Peut être ajouté au parm des fct si besoin de plusieurs port ds le prog
Source
- /******************************************************************************
- TestCOM.c :
-
- fonctions de base pour l'envoi et la réception de donner sur un port
- série RS232.
- ******************************************************************************/
-
- #include <windows.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
-
- /*=============================================================================
- Définition de constantes
- =============================================================================*/
- #define RX_SIZE 4096 /* taille tampon d'entrée */
- #define TX_SIZE 4096 /* taille tampon de sortie */
- #define MAX_WAIT_READ 5000 /* temps max d'attente pour lecture (en ms) */
-
-
- /*=============================================================================
- Variables globales.
- =============================================================================*/
-
- /* Handle du port COM ouvert */
- HANDLE g_hCOM = NULL;
-
- /* Délais d'attente sur le port COM */
- COMMTIMEOUTS g_cto =
- {
- MAX_WAIT_READ, /* ReadIntervalTimeOut */
- 0, /* ReadTotalTimeOutMultiplier */
- MAX_WAIT_READ, /* ReadTotalTimeOutConstant */
- 0, /* WriteTotalTimeOutMultiplier */
- 0 /* WriteTotalTimeOutConstant */
- };
-
- /* Configuration du port COM */
- DCB g_dcb =
- {
- sizeof(DCB), /* DCBlength */
- 9600, /* BaudRate */
- TRUE, /* fBinary */
- FALSE, /* fParity */
- FALSE, /* fOutxCtsFlow */
- FALSE, /* fOutxDsrFlow */
- DTR_CONTROL_ENABLE, /* fDtrControl */
- FALSE, /* fDsrSensitivity */
- FALSE, /* fTXContinueOnXoff */
- FALSE, /* fOutX */
- FALSE, /* fInX */
- FALSE, /* fErrorChar */
- FALSE, /* fNull */
- RTS_CONTROL_ENABLE, /* fRtsControl */
- FALSE, /* fAbortOnError */
- 0, /* fDummy2 */
- 0, /* wReserved */
- 0x100, /* XonLim */
- 0x100, /* XoffLim */
- 8, /* ByteSize */
- NOPARITY, /* Parity */
- ONESTOPBIT, /* StopBits */
- 0x11, /* XonChar */
- 0x13, /* XoffChar */
- '?', /* ErrorChar */
- 0x1A, /* EofChar */
- 0x10 /* EvtChar */
- };
-
- /*=============================================================================
- Fonctions du module.
- =============================================================================*/
- BOOL OpenCOM (int nId);
- BOOL CloseCOM ();
- BOOL ReadCOM (void* buffer, int nBytesToRead, int* pBytesRead);
- BOOL WriteCOM (void* buffer, int nBytesToWrite, int* pBytesWritten);
-
- /******************************************************************************
- main : point d'entrée du programme.
- ******************************************************************************/
- int main()
- {
- /* variables locales */
- char buffer[256];
- int nId, nChoice, nBytesWritten, nBytesRead;
-
- /* demande du numéro du port COM */
- printf("Entrez le numero du port COM : ");
- scanf("%d", &nId);
-
- /* tentative d'ouverture */
- printf("Ouverture et configuration du port COM%d...\r\n", nId);
- if(!OpenCOM(nId)) return -1;
- printf("...OK\r\n");
-
- /* boucle tant que l'on ne quitte pas */
- do
- {
- /* menu */
- printf("\r\n");
- printf("1 : Envoyer des donnees.\r\n");
- printf("2 : Recevoir des donnees.\r\n");
- printf("3 : Quitter.\r\n");
- printf("Choix : ");
- scanf("%d", &nChoice);
-
- /* enoyer des données */
- if(nChoice == 1)
- {
- printf("\r\n");
- printf("Donnees a envoyer :\r\n");
- fflush(stdin);
- gets(buffer);
- printf("\r\n");
- printf("Envoi des donnees...\r\n");
- if(WriteCOM(buffer, strlen(buffer), &nBytesWritten))
- printf("%d octet(s) envoye(s).\r\n", nBytesWritten);
- else
- printf("Erreur lors de l'envoi.\r\n");
- }
-
- /* recevoir des données */
- if(nChoice == 2)
- {
- printf("\r\n");
- printf("Reception de donnees...\r\n");
- if(ReadCOM(buffer, sizeof(buffer)-1, &nBytesRead))
- {
- buffer[nBytesRead] = '\0';
- printf("%d octet(s) recu(s) :\r\n%s\r\n", nBytesRead, buffer);
- }
- else
- printf("Erreur lors de la réception.\r\n");
- }
- }while(nChoice != 3);
-
- /* fermeture du port COM et retour */
- CloseCOM();
- return 0;
- }
-
- /******************************************************************************
- OpenCOM : ouverture et configuration du port COM.
- entrée : nId : Id du port COM à ouvrir.
- retour : vrai si l'opération a réussi, faux sinon.
- ******************************************************************************/
- BOOL OpenCOM(int nId)
- {
- /* variables locales */
- char szCOM[16];
-
- /* construction du nom du port, tentative d'ouverture */
- sprintf(szCOM, "COM%d", nId);
- g_hCOM = CreateFile(szCOM, GENERIC_READ|GENERIC_WRITE, 0, NULL,
- OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL);
- if(g_hCOM == INVALID_HANDLE_VALUE)
- {
- printf("Erreur lors de l'ouverture du port COM%d", nId);
- return FALSE;
- }
-
- /* affectation taille des tampons d'émission et de réception */
- SetupComm(g_hCOM, RX_SIZE, TX_SIZE);
-
- /* configuration du port COM */
- if(!SetCommTimeouts(g_hCOM, &g_cto) || !SetCommState(g_hCOM, &g_dcb))
- {
- printf("Erreur lors de la configuration du port COM%d", nId);
- CloseHandle(g_hCOM);
- return FALSE;
- }
-
- /* on vide les tampons d'émission et de réception, mise à 1 DTR */
- PurgeComm(g_hCOM, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
- EscapeCommFunction(g_hCOM, SETDTR);
- return TRUE;
- }
-
- /******************************************************************************
- CloseCOM : fermeture du port COM.
- retour : vrai si l'opération a réussi, faux sinon.
- ******************************************************************************/
- BOOL CloseCOM()
- {
- /* fermeture du port COM */
- CloseHandle(g_hCOM);
- return TRUE;
- }
-
- /******************************************************************************
- ReadCOM : lecture de données sur le port COM.
- entrée : buffer : buffer où mettre les données lues.
- nBytesToRead : nombre max d'octets à lire.
- pBytesRead : variable qui va recevoir le nombre d'octets lus.
- retour : vrai si l'opération a réussi, faux sinon.
- -------------------------------------------------------------------------------
- Remarques : - la constante MAX_WAIT_READ utilisée dans la structure
- COMMTIMEOUTS permet de limiter le temps d'attente si aucun
- caractères n'est présent dans le tampon d'entrée.
- - la fonction peut donc retourner vrai sans avoir lu de données.
- ******************************************************************************/
- BOOL ReadCOM(void* buffer, int nBytesToRead, int* pBytesRead)
- {
- return ReadFile(g_hCOM, buffer, nBytesToRead, pBytesRead, NULL);
- }
-
- /******************************************************************************
- WriteCOM : envoi de données sur le port COM.
- entrée : buffer : buffer avec les données à envoyer.
- nBytesToWrite : nombre d'octets à envoyer.
- pBytesWritten : variable qui va recevoir le nombre d'octets
- envoyés.
- retour : vrai si l'opération a réussi, faux sinon.
- ******************************************************************************/
- BOOL WriteCOM(void* buffer, int nBytesToWrite, int* pBytesWritten)
- {
- /* écriture sur le port */
- return WriteFile(g_hCOM, buffer, nBytesToWrite, pBytesWritten, NULL);
- }
/******************************************************************************
TestCOM.c :
fonctions de base pour l'envoi et la réception de donner sur un port
série RS232.
******************************************************************************/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
/*=============================================================================
Définition de constantes
=============================================================================*/
#define RX_SIZE 4096 /* taille tampon d'entrée */
#define TX_SIZE 4096 /* taille tampon de sortie */
#define MAX_WAIT_READ 5000 /* temps max d'attente pour lecture (en ms) */
/*=============================================================================
Variables globales.
=============================================================================*/
/* Handle du port COM ouvert */
HANDLE g_hCOM = NULL;
/* Délais d'attente sur le port COM */
COMMTIMEOUTS g_cto =
{
MAX_WAIT_READ, /* ReadIntervalTimeOut */
0, /* ReadTotalTimeOutMultiplier */
MAX_WAIT_READ, /* ReadTotalTimeOutConstant */
0, /* WriteTotalTimeOutMultiplier */
0 /* WriteTotalTimeOutConstant */
};
/* Configuration du port COM */
DCB g_dcb =
{
sizeof(DCB), /* DCBlength */
9600, /* BaudRate */
TRUE, /* fBinary */
FALSE, /* fParity */
FALSE, /* fOutxCtsFlow */
FALSE, /* fOutxDsrFlow */
DTR_CONTROL_ENABLE, /* fDtrControl */
FALSE, /* fDsrSensitivity */
FALSE, /* fTXContinueOnXoff */
FALSE, /* fOutX */
FALSE, /* fInX */
FALSE, /* fErrorChar */
FALSE, /* fNull */
RTS_CONTROL_ENABLE, /* fRtsControl */
FALSE, /* fAbortOnError */
0, /* fDummy2 */
0, /* wReserved */
0x100, /* XonLim */
0x100, /* XoffLim */
8, /* ByteSize */
NOPARITY, /* Parity */
ONESTOPBIT, /* StopBits */
0x11, /* XonChar */
0x13, /* XoffChar */
'?', /* ErrorChar */
0x1A, /* EofChar */
0x10 /* EvtChar */
};
/*=============================================================================
Fonctions du module.
=============================================================================*/
BOOL OpenCOM (int nId);
BOOL CloseCOM ();
BOOL ReadCOM (void* buffer, int nBytesToRead, int* pBytesRead);
BOOL WriteCOM (void* buffer, int nBytesToWrite, int* pBytesWritten);
/******************************************************************************
main : point d'entrée du programme.
******************************************************************************/
int main()
{
/* variables locales */
char buffer[256];
int nId, nChoice, nBytesWritten, nBytesRead;
/* demande du numéro du port COM */
printf("Entrez le numero du port COM : ");
scanf("%d", &nId);
/* tentative d'ouverture */
printf("Ouverture et configuration du port COM%d...\r\n", nId);
if(!OpenCOM(nId)) return -1;
printf("...OK\r\n");
/* boucle tant que l'on ne quitte pas */
do
{
/* menu */
printf("\r\n");
printf("1 : Envoyer des donnees.\r\n");
printf("2 : Recevoir des donnees.\r\n");
printf("3 : Quitter.\r\n");
printf("Choix : ");
scanf("%d", &nChoice);
/* enoyer des données */
if(nChoice == 1)
{
printf("\r\n");
printf("Donnees a envoyer :\r\n");
fflush(stdin);
gets(buffer);
printf("\r\n");
printf("Envoi des donnees...\r\n");
if(WriteCOM(buffer, strlen(buffer), &nBytesWritten))
printf("%d octet(s) envoye(s).\r\n", nBytesWritten);
else
printf("Erreur lors de l'envoi.\r\n");
}
/* recevoir des données */
if(nChoice == 2)
{
printf("\r\n");
printf("Reception de donnees...\r\n");
if(ReadCOM(buffer, sizeof(buffer)-1, &nBytesRead))
{
buffer[nBytesRead] = '\0';
printf("%d octet(s) recu(s) :\r\n%s\r\n", nBytesRead, buffer);
}
else
printf("Erreur lors de la réception.\r\n");
}
}while(nChoice != 3);
/* fermeture du port COM et retour */
CloseCOM();
return 0;
}
/******************************************************************************
OpenCOM : ouverture et configuration du port COM.
entrée : nId : Id du port COM à ouvrir.
retour : vrai si l'opération a réussi, faux sinon.
******************************************************************************/
BOOL OpenCOM(int nId)
{
/* variables locales */
char szCOM[16];
/* construction du nom du port, tentative d'ouverture */
sprintf(szCOM, "COM%d", nId);
g_hCOM = CreateFile(szCOM, GENERIC_READ|GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL);
if(g_hCOM == INVALID_HANDLE_VALUE)
{
printf("Erreur lors de l'ouverture du port COM%d", nId);
return FALSE;
}
/* affectation taille des tampons d'émission et de réception */
SetupComm(g_hCOM, RX_SIZE, TX_SIZE);
/* configuration du port COM */
if(!SetCommTimeouts(g_hCOM, &g_cto) || !SetCommState(g_hCOM, &g_dcb))
{
printf("Erreur lors de la configuration du port COM%d", nId);
CloseHandle(g_hCOM);
return FALSE;
}
/* on vide les tampons d'émission et de réception, mise à 1 DTR */
PurgeComm(g_hCOM, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
EscapeCommFunction(g_hCOM, SETDTR);
return TRUE;
}
/******************************************************************************
CloseCOM : fermeture du port COM.
retour : vrai si l'opération a réussi, faux sinon.
******************************************************************************/
BOOL CloseCOM()
{
/* fermeture du port COM */
CloseHandle(g_hCOM);
return TRUE;
}
/******************************************************************************
ReadCOM : lecture de données sur le port COM.
entrée : buffer : buffer où mettre les données lues.
nBytesToRead : nombre max d'octets à lire.
pBytesRead : variable qui va recevoir le nombre d'octets lus.
retour : vrai si l'opération a réussi, faux sinon.
-------------------------------------------------------------------------------
Remarques : - la constante MAX_WAIT_READ utilisée dans la structure
COMMTIMEOUTS permet de limiter le temps d'attente si aucun
caractères n'est présent dans le tampon d'entrée.
- la fonction peut donc retourner vrai sans avoir lu de données.
******************************************************************************/
BOOL ReadCOM(void* buffer, int nBytesToRead, int* pBytesRead)
{
return ReadFile(g_hCOM, buffer, nBytesToRead, pBytesRead, NULL);
}
/******************************************************************************
WriteCOM : envoi de données sur le port COM.
entrée : buffer : buffer avec les données à envoyer.
nBytesToWrite : nombre d'octets à envoyer.
pBytesWritten : variable qui va recevoir le nombre d'octets
envoyés.
retour : vrai si l'opération a réussi, faux sinon.
******************************************************************************/
BOOL WriteCOM(void* buffer, int nBytesToWrite, int* pBytesWritten)
{
/* écriture sur le port */
return WriteFile(g_hCOM, buffer, nBytesToWrite, pBytesWritten, NULL);
}
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
[MIX 2010] - TELECHARGEZ INTERNET EXPLORER 9 EN PREVIEW ![MIX 2010] - TELECHARGEZ INTERNET EXPLORER 9 EN PREVIEW ! par redo
La Preview de Windows Explorer 9 est maintenant disponible à l'adresse suivante : http://ie.microsoft.com/testdrive/ Cette version ne nécessite pas un redémarrage de votre machine pour être exploitée . Cette version est fonctionnelle mais reste cependant ...
Cliquez pour lire la suite de l'article par redo [MIX 2010] - KEYNOTE DAY 2 ONLINE : WINDOWS INTERNET EXPLORER 9, JQUERY, ODATA ET DALLAS CTP2 ![MIX 2010] - KEYNOTE DAY 2 ONLINE : WINDOWS INTERNET EXPLORER 9, JQUERY, ODATA ET DALLAS CTP2 ! par redo
Dans la lignée du premier keynote, retrouvez la vidéo du second keynote en ligne : Visionnez la vidéo à l'url suivante : http://www.microsoft.com/presspass/events/mix/VideoGallery.aspx Vous y retrouverez ainsi les speakers Scott Guthrie, Dean Hachamovitch...
Cliquez pour lire la suite de l'article par redo [MIX 2010] - RETOUR D'EXPéRIENCE DéVELOPPEMENT SEESMIC SUR WINDOWS PHONE 7[MIX 2010] - RETOUR D'EXPéRIENCE DéVELOPPEMENT SEESMIC SUR WINDOWS PHONE 7 par redo
En avant première, Loic le retour d'expérience de Loïc Le Meur du portage de l'application http://seesmic.com/ sur plateforme Windows Phone 7 . c'était d'ailleurs une des rares opportunités de tester, voir toucher le nouveau device . voyez par vous-même :...
Cliquez pour lire la suite de l'article par redo [MIX 2010] - LE KEYNOTE DAY 1 DISPONIBLE ONLINE ![MIX 2010] - LE KEYNOTE DAY 1 DISPONIBLE ONLINE ! par redo
Si tout comme moi, vous avez manqué de peu le premier keynote du Microsoft Mix 2010, je vous invite à prendre deux heure et le consulter ci-dessous . Visionnez le Keynote à l'url suivante : http://www.microsoft.com/Presspass/events/mix/videoGallery.aspx?c...
Cliquez pour lire la suite de l'article par redo VISUAL STUDIO TALK SHOW: EF4VISUAL STUDIO TALK SHOW: EF4 par Matthieu MEZIL
La semaine dernière, j'étais à Montréal pour y animer des conférences sur Entity Framework. J'en ai profité pour enregister un podcast Visual Studio Talk Show que vous pouvez retrouver ici ....(read more) ...
Cliquez pour lire la suite de l'article par Matthieu MEZIL
Logiciels
Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods Konvertor (4.00)KONVERTOR (4.00)Le logiciel est un gestionnaire multimedia affichant, jouant et convertissant plus de 2000 format... Cliquez pour télécharger Konvertor
|