Accueil > Forum > > > > Envoi sur port série
Envoi sur port série
lundi 15 novembre 2010 à 00:49:00 |
Envoi sur port série

alilou2955
|
Bonjour.
J'ai modifié un pgme C dispo sur le net pour l'adapter à mes besoins.
Bref, ce programme C est sensé envoyer des données qu'il récupère du fichier BehavSimul.txt.
Le programme semble faire ce qui lui est demandé, mais quand j'ai créé un autre programme qui écoute ce qui est envoyé sur ce port, je me suis rendu compte que parfois il envoie la chaine1 et la moitié de la chaine 2 à la fois, parfois juste la moitié d'une chaine. Si vous comprenez où est le problème, je vous remercie de me l'indiquer.
Voici le contenu du programme SendDataToSerialPort.c
Code C/C++ :
/******************************************************************************
SendDataToSerialPort.c
Ce petit soft permet de lire le contenu du fichier BehavSimul.txt formé de
plusieurs lignes. Chaque ligne a la forme suivante "DETEX00x y", où x
correspond au numéro du capteur qui a détecté le mouvement du patient et y le
temps passé par le patient dans la zone couverte par le capteur x.
Ce soft envoie donc sur le port COMz (z à lire via le clavier) la commande
DETEX00x, puis attend y secondes avant de reboucler pour lire la prochaine ligne
....
******************************************************************************/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//#include <SDL/SDL.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 */
19200, /* BaudRate */ //J'ai mis 19200 au lieu de 9600,
TRUE, /* fBinary */
FALSE, /* fParity */
FALSE, /* fOutxCtsFlow */
FALSE, /* fOutxDsrFlow */
DTR_CONTROL_DISABLE, /* 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, DWORD nBytesToRead, LPDWORD pBytesRead);
BOOL WriteCOM (void* buffer, DWORD nBytesToWrite, LPDWORD pBytesWritten);
/******************************************************************************
main : point d'entrée du programme.
******************************************************************************/
int main(void)
{
/* variables locales */
char buffer[256];
int nId, nChoice;//, nBytesWritten, nBytesRead;
//int* pByteRead, pByteWritten;
DWORD nBytesWritten, nBytesRead;
/* demande du numéro du port COM */
// On boucle tant que le numéro de port est le bon
int GoodCOM=0;
while (!GoodCOM)
{
printf("\nEntrez 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)) {printf ("\nImpossible d'ouvrir le port COM%d. Soit il est occupe', soit il n'existe pas.\n (CTRL-C pour quitter)\n",nId);} //system ("PAUSE") ; return -1;}
else {GoodCOM=1; printf("...OK, port COM%d ouvert\r\n",nId);}
}
//CloseCOM();
/* Envoyer les données sur le port ComX. Boucle jusqu'à fin du fichier*/
// Ouvrir le fichier qui contient le circuit parcouru par le patient (simulation) : BehavSimul.txt
FILE *f=NULL;
int tps_Transition;
char position[]="DETX001";
char *nomfichier="BehavSimul.txt";
f=fopen(nomfichier,"r" );
if (f==NULL) {printf ("\nImpossible d'ouvrir le fichier %s. Peut-être ce nom est incorrect.\n", nomfichier); exit(1);}
else printf ("Fichier %s ouvert\n",nomfichier);
while (fscanf(f,"%s %d",position,&tps_Transition)!=EOF){
printf("\nCommande enregistre'e: %s. Temps passe' dans cette zone: %d secondes.\n",position,tps_Transition);
//OpenCOM(nId);
if(WriteCOM(position,strlen(position), &nBytesWritten)) //Pour enlever doute, je mets parfois des valeurs fixes 7, 8... au lieu de strlen(position)
printf("%d octet(s) envoye(s).\r\n", (int)nBytesWritten);
else
printf("Erreur lors de l'envoi.\r\n");
printf ("La commande \"%s\" est envoye'e sur le port COM%d.\n",position,nId);
printf ("Attente de %d secondes avant envoi de la prochaine commande.\n",tps_Transition);
SDL_Delay(1000*tps_Transition);
PurgeComm(g_hCOM, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
} //fin du while
fclose (f); // Fermeture du fichier ouvert
CloseCOM(); /* fermeture du port COM et retour */
system("PAUSE"); //Faire une pause (arret) avant de quitter la fenetre DOS
return 0;
} // fin de main
/******************************************************************************
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);
//Commenté, car DTR désactivé
//EscapeCommFunction(g_hCOM, SETDTR);
return TRUE;
} //Fin fct OpenCOM()
/******************************************************************************
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;
} // Fin fct CloseCOM()
/******************************************************************************
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, DWORD nBytesToRead, LPDWORD 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, DWORD nBytesToWrite, LPDWORD pBytesWritten)
{
/* écriture sur le port */
return WriteFile(g_hCOM, buffer, nBytesToWrite, pBytesWritten, NULL);
}
Voici le contenu du fichier BehavSimul.txt:
Code :
DETX001 2
DETX002 5
DETX008 2
DETX009 6
DETX008 2
DETX009 3
DETX008 3
DETX002 2
DETX001 4
Voici les résultats des tests que j'ai effectués:
Résultat de l'exécution du programme SendDataToSerialPort.exe :
Code :
Entrez le numero du port COM : 1
Ouverture et configuration du port COM1...
...OK, port COM1 ouvert
Fichier BehavSimul.txt ouvert
Commande enregistre'e: DETX001. Temps passe' dans cette zone: 2 secondes.
7 octet(s) envoye(s).
La commande "DETX001" est envoye'e sur le port COM1.
Attente de 2 secondes avant envoi de la prochaine commande.
Commande enregistre'e: DETX002. Temps passe' dans cette zone: 5 secondes.
7 octet(s) envoye(s).
La commande "DETX002" est envoye'e sur le port COM1.
Attente de 5 secondes avant envoi de la prochaine commande.
Commande enregistre'e: DETX008. Temps passe' dans cette zone: 2 secondes.
7 octet(s) envoye(s).
La commande "DETX008" est envoye'e sur le port COM1.
Attente de 2 secondes avant envoi de la prochaine commande.
Commande enregistre'e: DETX009. Temps passe' dans cette zone: 6 secondes.
7 octet(s) envoye(s).
La commande "DETX009" est envoye'e sur le port COM1.
Attente de 6 secondes avant envoi de la prochaine commande.
Commande enregistre'e: DETX008. Temps passe' dans cette zone: 2 secondes.
7 octet(s) envoye(s).
La commande "DETX008" est envoye'e sur le port COM1.
Attente de 2 secondes avant envoi de la prochaine commande.
Commande enregistre'e: DETX009. Temps passe' dans cette zone: 3 secondes.
7 octet(s) envoye(s).
La commande "DETX009" est envoye'e sur le port COM1.
Attente de 3 secondes avant envoi de la prochaine commande.
Commande enregistre'e: DETX008. Temps passe' dans cette zone: 3 secondes.
7 octet(s) envoye(s).
La commande "DETX008" est envoye'e sur le port COM1.
Attente de 3 secondes avant envoi de la prochaine commande.
Commande enregistre'e: DETX002. Temps passe' dans cette zone: 2 secondes.
7 octet(s) envoye(s).
La commande "DETX002" est envoye'e sur le port COM1.
Attente de 2 secondes avant envoi de la prochaine commande.
Commande enregistre'e: DETX001. Temps passe' dans cette zone: 4 secondes.
7 octet(s) envoye(s).
La commande "DETX001" est envoye'e sur le port COM1.
Attente de 4 secondes avant envoi de la prochaine commande.
..
Appuyez sur une touche pour continuer...
Voici ce que j'ai capturé sur le port COM2 (COM1 et COM2 sont virtuels !!!), suite à l'exécution du programme SendDataToSerialPort.exe:
Code :
Entrez le numero du port a ecouter COM : 2
Ouverture et configuration du port COM2...
...OK, port COM2 ouvert
7 octet(s) recu(s) :DETX001
7 octet(s) recu(s) :DETX002
14 octet(s) recu(s) :DETX008DETX009
7 octet(s) recu(s) :DETX008
14 octet(s) recu(s) :DETX009DETX008
14 octet(s) recu(s) :DETX002DETX001
J'ai fait un autre test où j'ai modifié le prgme comme suit: J'ai mis "if(WriteCOM(position,8, &nBytesWritten))" (ie. à la place de strlen(position) j'ai mis la valeur 8)
Code :
Entrez le numero du port COM : 1
Ouverture et configuration du port COM1...
...OK, port COM1 ouvert
Fichier BehavSimul.txt ouvert
Commande enregistre'e: DETX001. Temps passe' dans cette zone: 2 secondes.
8 octet(s) envoye(s).
La commande "DETX001" est envoye'e sur le port COM1.
Attente de 2 secondes avant envoi de la prochaine commande.
Commande enregistre'e: DETX002. Temps passe' dans cette zone: 5 secondes.
8 octet(s) envoye(s).
La commande "DETX002" est envoye'e sur le port COM1.
Attente de 5 secondes avant envoi de la prochaine commande.
Commande enregistre'e: DETX008. Temps passe' dans cette zone: 2 secondes.
8 octet(s) envoye(s).
La commande "DETX008" est envoye'e sur le port COM1.
Attente de 2 secondes avant envoi de la prochaine commande.
Commande enregistre'e: DETX009. Temps passe' dans cette zone: 6 secondes.
8 octet(s) envoye(s).
La commande "DETX009" est envoye'e sur le port COM1.
Attente de 6 secondes avant envoi de la prochaine commande.
Commande enregistre'e: DETX008. Temps passe' dans cette zone: 2 secondes.
8 octet(s) envoye(s).
La commande "DETX008" est envoye'e sur le port COM1.
Attente de 2 secondes avant envoi de la prochaine commande.
Commande enregistre'e: DETX009. Temps passe' dans cette zone: 3 secondes.
8 octet(s) envoye(s).
La commande "DETX009" est envoye'e sur le port COM1.
Attente de 3 secondes avant envoi de la prochaine commande.
Commande enregistre'e: DETX008. Temps passe' dans cette zone: 3 secondes.
8 octet(s) envoye(s).
La commande "DETX008" est envoye'e sur le port COM1.
Attente de 3 secondes avant envoi de la prochaine commande.
Commande enregistre'e: DETX002. Temps passe' dans cette zone: 2 secondes.
8 octet(s) envoye(s).
La commande "DETX002" est envoye'e sur le port COM1.
Attente de 2 secondes avant envoi de la prochaine commande.
Commande enregistre'e: DETX001. Temps passe' dans cette zone: 4 secondes.
8 octet(s) envoye(s).
La commande "DETX001" est envoye'e sur le port COM1.
Attente de 4 secondes avant envoi de la prochaine commande.
..
Appuyez sur une touche pour continuer...
Voici ce que j'ai capturé sur le port COM2 suite à l'exécution du programme SendDataToSerialPort.exe:
Code :
Entrez le numero du port COM : 2
Ouverture et configuration du port COM2...
...OK
Debut de reception de donnees sur COM2
DETX001DETX002DETX008ETX009DETX008ETX009TX008X002001
==> Il me manque les retour à la ligne de cette dernière ligne, mais on remarque déjà sur cette ligne que les messages envoyés ("DETX001" ou "DETX002"...) ne sont pas reçus entièrement; ils sont coupés.
Cette chaine de caractère est envoyée telle qu'elle mais parfois elle est reçue tronquée.
|
|
lundi 22 novembre 2010 à 17:03:15 |
Re : Envoi sur port série

atlantic44
|
Le cable utilisé est-il complet (TD, RD, RTS, CTS, DCD, DTR) ? ou seulement TD et RD
En général cela vient du fait que le flux de données n'est pas géré (protocole "attrape si tu peux")! Il faut un protocole de gestion des flux matériel (RTS-CTS ) ou logiciel XON-XOFF sinon problème avec les tampons!
L'informatique à la folie!
|
|
Cette discussion est classée dans : port, secondes, commande, octet, envoye
Répondre à ce message
Sujets en rapport avec ce message
envoye et reception de commande AT via port série [ par wissem34 ]
S A L U Tje suis etudiant developpement informatique, je prépare mon projet de fin de formation concernat l'envoi des SMS via ordinateur vers les tel
Mon prog C++ & port// ne se compile pas sous DEVc++ [ par Sixon ]
Salut, Infos..: Mon projet consiste à envoyé sur le port parallèle les secondes systèmes sur un circuit électronique constitué de 2 décodeur BCD et de
Commande de port série [ par Taurnil ]
Bonjour, tout d'abord excusez-moi si ma question a déjà été traitée quelque part, j'ai vu qu'il existait quelques topics sur le port série mais je n'a
cadencement port série [ par yangan ]
Je voudrais cadencer l'envoye de données sur on port série à hauteur d'un envoye toutes le 40ms,tout ça sous dos.Je pense qu'on doit pouvoir le faire
commande PIC 68HC11E2 [ par salim_samir ]
salut à touscomment je peut tester un bit de port c de pic 68HC11E2 et commander un clignotement de 4 lampe (si le bit x de port c est vrais fait un c
interface de commande port parallele [ par jadtls ]
bonjour,j'ai un projet de commande d'un moteur pas a pas a partir d'une interface C++...ainsi j'aimerais bien connaitre le code en c++ d'ecrire sur le
Envoyer et recevoir en RS232 depuis dos... [ par onki ]
Bonjour à tous, je cherche à envoyer et recevoir des lignes de caractères par les port COM3 et COM4 du PC, et en recevoir. Le tout, depuis dos, en cr
envoie des données sur le port parallèle [ par popossi ]
salut à tous,je suis élève ingénieur en génie élèctrique je veux réaliser un mini projet qui concerne à écrire un programme en C qui génère 5 nombres
Commande FTP quote site filetype=xxx [ par kalimanu ]
Bonjour, J'utilise Visual C++ 6.0 pour effectuer des transferts CFT. Je parviens bien à envoyer ou recevoir des fichiers mais je bloque sur l'utilisat
établir communication entre 2 machine a l'aide d'un port RS232 [ par ZniperCS ]
svp je veux bien savoir commen établir une communication entre 2 machine a l'aide d'un port 232, jé pu ecrire seulemen le programme de savoir chercher
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|