BASE COMMUNICATION SÉRIE RS232 (WIN32)

greglebreton Messages postés 2 Date d'inscription mardi 11 mai 2004 Statut Membre Dernière intervention 12 mai 2004 - 12 mai 2004 à 12:16
idrol1 Messages postés 2 Date d'inscription jeudi 10 février 2011 Statut Membre Dernière intervention 11 février 2011 - 4 avril 2012 à 04:36
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/22441-base-communication-serie-rs232-win32

idrol1 Messages postés 2 Date d'inscription jeudi 10 février 2011 Statut Membre Dernière intervention 11 février 2011
4 avril 2012 à 04:36
excusez moi c'est quoi ce fflush(stdin) ?
jdell3 Messages postés 2 Date d'inscription vendredi 19 mai 2006 Statut Membre Dernière intervention 6 février 2011
6 févr. 2011 à 19:54
Bonjour,
j'aimerais simplement envoyer la commande 'pwr on' à un videoprojecteur. Ca ne fonctionne pas avec cette application mais fonctionne trés bien avec la version plus compléte. Quelqu'un peu me dire pourquoi? Pour info, j'aimerais modifier la version simplifier pour éteindre ou allumer un vidéo juste en executant le .exe
merci de me venir en aide!!!!!!
cs_victorjung Messages postés 7 Date d'inscription dimanche 9 janvier 2011 Statut Membre Dernière intervention 15 février 2011
4 févr. 2011 à 15:48
C'est un super code merci vraiment,
mais sous qt, il fait une erreure, avec le char* to const wchar*
et celle ci je ne sais pas comment la resoudre... j'ai tenté un petit (const wchar*) devant l'argument
ou sa plante (le premier de opencom) alors sa compile mais la fonction opencom echoue ...
cs_victorjung Messages postés 7 Date d'inscription dimanche 9 janvier 2011 Statut Membre Dernière intervention 15 février 2011
1 févr. 2011 à 17:26
je vais me taire en fait puisque c est explique plus haut:)
cs_victorjung Messages postés 7 Date d'inscription dimanche 9 janvier 2011 Statut Membre Dernière intervention 15 février 2011
1 févr. 2011 à 12:01
Bonjour;j aimerais savoir ce qu il faut faire pour compiler en cpp; en fait tant
que je l utilise en c sous codeblock c est nikel; mais si je veux l utiliser en cpp il acceptepas les dword!!!
Merci por votre aide!!!
badr91 Messages postés 1 Date d'inscription samedi 29 août 2009 Statut Membre Dernière intervention 24 juin 2010
24 juin 2010 à 16:41
bonjour, et merci pour ce super code.
je voudrais savoir comment envoyer les données en caractère ASCII ?
merci d'avance pour votre réponse.
cs_kingkouka Messages postés 4 Date d'inscription jeudi 26 janvier 2006 Statut Membre Dernière intervention 4 mai 2010
4 mai 2010 à 16:26
c'est bon, ça marche.............Juste un problème de virtualisation de port...Mon microcontrolleur est connecté à un port USB qui se connecte virtuellement au port série...Il voit le port série 1 comme un port série 4....Donc il fallait juste choisir n° port = 4 au lieu de 1....

Merci pour ton code extra............

entre temps, j'ai modifié le code le code qui était venu avec le microcontrolleur, et lui aussi marche à merveille.....
cs_kingkouka Messages postés 4 Date d'inscription jeudi 26 janvier 2006 Statut Membre Dernière intervention 4 mai 2010
30 avril 2010 à 10:09
bonjour,
j'aimerai faire fonctionner ce code avec un microcontrolleur. Pouvez-vous me dire comment faire? En fait lorsque je compile ce code sur Dev-C++, il se compile très bien et on peut l'exécuter. Mais je veux lire les données émises par mon micro-contrôleur, comment faire? J'ai connecté mon microcontrolleur, et je lance le code, en spécifiant le "choix 2" (réception de données), mais rien ne se passe.

merci de votre aide
jludovic Messages postés 2 Date d'inscription mardi 30 mars 2010 Statut Membre Dernière intervention 30 mars 2010
30 mars 2010 à 17:10
Bonjour dongonis38,
Les donnes sont en effet bufferisees (taille max 1024).
Serait ce possible que je t'envoie le programme pour que tu vois clairement ce qu'il en est ?

a+
dongonis38 Messages postés 8 Date d'inscription jeudi 25 mars 2010 Statut Membre Dernière intervention 15 avril 2010
30 mars 2010 à 11:49
J'ai finalement trouvé la réponse a mon pb il faut tout simplement terminner la chaine par \r\n.

Ludovic les données ne sont pas bufferisées par ton motor controlleur?
ps : je vais devoir faire la même chose que toi bientot!
jludovic Messages postés 2 Date d'inscription mardi 30 mars 2010 Statut Membre Dernière intervention 30 mars 2010
30 mars 2010 à 04:28
Bonjour à tous,

j'essaie de programmer l'écriture via un port série afin de faire fonctionner un moteur ou plus précisément un motor controller. Celui-ci reçoit par la RS232 une chaine de caractère codé en Hexadecimal. Le problème est qu'il ne lit pas une chaine de caractère en une seule fois mais caractère par caractère...
Je ne vois pas comment faire, j'ai essayé plusieurs façon mais sans résultat.
Je suis un stricte débutant en la matière.
En espérant que vous puissiez me donner un petit coup de pouce.

Merci d'avance,

Ludovic

Windows XP, Visual c++
dongonis38 Messages postés 8 Date d'inscription jeudi 25 mars 2010 Statut Membre Dernière intervention 15 avril 2010
29 mars 2010 à 14:33
J'ai finalement réussit à faire marcher le programme j'envoye par exemple le buffer correspondant a -> char buffer [] = "\x43\x46\x20\x35\x35\x35\x35\x35\x0D\x09";.

Cependant pour une 2eme commande comme par exemple char buffer2 [] = "\x43\x46\x20\x39\x39\x39\x0D\x09"; ca ne marche pas, cette commande est pourtant bien recu mais non reconnue. Est ce un probleme lié au tempo? ou il fait que ma commande finisse par qqch en particulier?

Merci de votre aide.
dongonis38 Messages postés 8 Date d'inscription jeudi 25 mars 2010 Statut Membre Dernière intervention 15 avril 2010
29 mars 2010 à 10:35
Salut ymca2003
J'arrive pas a faire marcher ce code, j'aimerais envyer "CF 500" par exemple, que dois-je taper exactement?
De plus j'aimerais faire du 9600bds, 8 bits, pas de parité, 1 bit de stop, pas de protocole, comment dois-je modifier dcb?

Merci de votre aide!
imedo Messages postés 21 Date d'inscription lundi 15 janvier 2007 Statut Membre Dernière intervention 31 mars 2009
7 avril 2009 à 16:20
salut ymca2003,
merci pour ton code
je suis entrain de faire un prog partie client partie serveur pour communiquer entre eu sur le port serie
le client permet d'ecrire de trame stocker dans un fichier sur le port serie et le serveur permet de lire le trame ecrit sur le port.
comment je peut utiliser votre code pour envoyer de donnee stocker dans un fichier.
merci pour votre aide.
elbuey76 Messages postés 2 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 6 février 2009
6 févr. 2009 à 21:57
Merci mais j'ai trouvé mon erreur, j'ai baisser la vitesse de transmission a 2 bauds pour pouvoir voir quelque chose sur mon vieu oscillo, du coup l'envoi des octets (et le petit temps a 0 qui suit) qui prennent habituelement une dizaine de nanosecondes on pris 5 minutes, le programme attendai pour fermer...
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
5 févr. 2009 à 09:35
Tu réalise une boucle infinie sûrement.
Essaye de faire ça en thred avec une implémentation d'un timeout et d'un compteur de lectures pour voir s'il va trop vite.
Sans ton code on ne peut pas t'aider.
Sinon tu poste ça sur le forum.
Pour le pb de compilation tu as sûrement demandé à Windows de le débugger ou alors il est encore en execution.
elbuey76 Messages postés 2 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 6 février 2009
4 févr. 2009 à 19:43
Bonjour a tous,

J'ai pris un peu de temps pour comprendre le code, je l'ai compris et integré les fonctions qui m'interesse dans mon propre programme.
Resultat: les données sont envoyé nikel, le programme marche bien, puis tout a coup impossible de quitter l'application, le pc mouline pendant 1/4 d'heure pour fermer le programme.
Je bidouille un peu mon code, je commence a avoir des erreur de compilation "permission denied"...
En faite cette erreur aparait aléatoirement, quelque fois meme en compilant un code qui marchait deja !

Finalement je fini par deduire que c'est le closehandle() qui pose probleme pour quitter l'appli.
Donc je reprend le programme original de YMCA, meme chose, impossible de quitter le programme et de temps a autre une erreur de compilation, alors qu'au debut il marchait bien.


Quelqu'un a une idée ? Merci
cs_fabrice91 Messages postés 27 Date d'inscription jeudi 13 avril 2006 Statut Membre Dernière intervention 28 janvier 2009
15 janv. 2009 à 09:52
Dsl, je n'ai pas été très clair (ou alors j'ai pas compris, ce qui est probable), qd je parle du handle, il s'agit de celui renvoyé par la fonction createfile() donc le handle du port série (variable : g_hCOM)
En fait je voudrais simplement rajouter par rapport au code initial dans chacune des 4 fonctions le paramètre g_hCOM (le handle du port série), et en faire une dll. Voila tout
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
14 janv. 2009 à 18:12
case DLL_PROCESS_ATTACH:
Te dit quand la DLL est attachée au programme qui l'appelle et donne son handle.
cs_fabrice91 Messages postés 27 Date d'inscription jeudi 13 avril 2006 Statut Membre Dernière intervention 28 janvier 2009
14 janv. 2009 à 17:49
Qu'entends tu par "attachement DLL"?
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
14 janv. 2009 à 17:09
Normalement tu dois récupérer le handle de l'attachement DLL.
Après je sais pas si tu peux l'utiliser dans ce code.
cs_fabrice91 Messages postés 27 Date d'inscription jeudi 13 avril 2006 Statut Membre Dernière intervention 28 janvier 2009
14 janv. 2009 à 14:45
Voila mon code de la dll avec le handle passé en argument. Le code se compile (et me créer une dll), sf que lorsque je souhaite utiliser la dll, cela ne fonctionne pas. Le problème vient de la dll, mais d'ou?...

Merci d'avance pour l'aide que vous pourrez (j'espère) m'apporter.
(les deux fichiers dllFAB_pointeur.h et dllFAB_pointeur.c):

dllFAB_pointeur.h :

#ifndef __dllFAB_pointeur_H__
#define __dllFAB_pointeur_H__
#define DllImport __declspec(dllimport)

#include <windows.h>

/* To use this exported function of dll, include this header
// * in your project.
// */
//
//#ifdef BUILD_DLL
// #define DLL_EXPORT __declspec(dllexport)
//#else
// #define DLL_EXPORT __declspec(dllimport)
//#endif
//
//
//#ifdef __cplusplus
//extern "C"
//{
//#endif
//
//void DLL_EXPORT SomeFunction(const LPCSTR sometext);
//
//#ifdef __cplusplus
//}
//#endif
BOOL DllImport OpenCOM (HWND *g_hCOM, int nId);
BOOL DllImport CloseCOM (HWND *g_hCOM);
BOOL DllImport ReadCOM (HWND *g_hCOM, void* buffer, int nBytesToRead, int* pBytesRead);
BOOL DllImport WriteCOM (HWND *g_hCOM, void* buffer, int nBytesToWrite, int* pBytesWritten);

#endif

dllFAB_pointeur.c :

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "dllFAB_pointeur.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 3000 /* temps max d'attente pour lecture (en ms) */
#define DllExport __declspec(dllexport)

/******************************************************************************
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 DllExport OpenCOM(HWND *g_hCOM, int nId)
{
/* variables locales */
char szCOM[16];
/* 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 */
};

/* construction du nom du port, tentative d'ouverture */
sprintf(szCOM, "COM%d", nId);
*g_hCOM = (HWND)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 DllExport CloseCOM(HWND *g_hCOM)
{
/* 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 DllExport ReadCOM(HWND *g_hCOM, void* buffer, int nBytesToRead, int* pBytesRead)
{
/*return ReadFile(g_hCOM, buffer, nBytesToRead, pBytesRead, NULL);*/
return ReadFile(*g_hCOM, buffer, nBytesToRead, (DWORD*)pBytesRead, NULL);/*ajout d'un cast*/
}

/******************************************************************************
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 DllExport WriteCOM(HWND *g_hCOM, void* buffer, int nBytesToWrite, int* pBytesWritten)
{
/* écriture sur le port */
/*return WriteFile(g_hCOM, buffer, nBytesToWrite, pBytesWritten, NULL);*/
return WriteFile(*g_hCOM, buffer, nBytesToWrite, (DWORD*)pBytesWritten, NULL);

}

BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;

case DLL_PROCESS_DETACH:
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;
}

/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
cs_fabrice91 Messages postés 27 Date d'inscription jeudi 13 avril 2006 Statut Membre Dernière intervention 28 janvier 2009
13 janv. 2009 à 17:09
Re...

J'ai une seconde question, de débutant, c'est sûr... bref, tu mets au début de ton code que "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". Et bien j'ai essayé, en ajoutant un pointeur du handle dans chacune des fonctions. A la compilation aucune erreurs, mais quand je le lance et que le prog me demande le num du port, le prog plante. Peux tu me donner un coup de main s'il te plait?

Merci d'avance.

PS : Le but final est de faire une dll des 4 fonctions sans qu'il y ait de variable globale...
cs_fabrice91 Messages postés 27 Date d'inscription jeudi 13 avril 2006 Statut Membre Dernière intervention 28 janvier 2009
8 janv. 2009 à 17:42
Salut YMCA,

Merci beaucoup de nous mettre à dispo tes codes, j'ai une question à te poser :

j'ai utilisé ton code en rajoutant la partie pour entrer les commandes en hexa (cf post du 12/01/2006 05:24:40) et qd je l'utilise tel quel cela ne fonctionne pas (je souhaite écrire les données suivante que j'écris tel quel dans la fenêtre de commande une fois avoir choisit l'envoie de données : 02363130313031323220202020203103 dsl c'est un peu long) les données sont reçu mais pas de réaction de la machine, par contre en écrivant "en dur" dans le code : WriteCOM("\x02\x36\x31\x30\x31\x30\x31\x32\x32\x20\x20\x20\x20\x20\x31\x03", 16, &nb);
cela fonctionne... As tu une explication? (j'écris pas correctement la commande, ou la conversion en hexa dans le code est erronée...

Merci d'avance pour ta réponse
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
23 oct. 2008 à 19:04
Essaye de faire un petit Sleep(50) entre tes commandes.
Golgfag Messages postés 1 Date d'inscription samedi 23 avril 2005 Statut Membre Dernière intervention 23 octobre 2008
23 oct. 2008 à 14:34
Bonjour,
J'ai aussi une petite question (peut etre de novice ;) )
Alors j'ai un projet d'automatisation d'envoi de configuration sur switch.
Il y as énormément de ligne a envoyer sur le port Console de mes switch.
Ton programme fonctionne mais pas pour un grande nombre d'envoi. Par exemple j'ai reussi a faire passé trois commandes:

char buffer[256]=" \r\n en \r\n conf t \r\n hostname test \r\n";

Mais si je met toute mes commandes comme ceci ca ne passe pas biensur...
Je suis novice dans le milieu de la prog je suis plutot dans celui du réseau, je remerci d'avance celui ou celle qui sera capable de m'aidé.
cs_quentennis Messages postés 2 Date d'inscription vendredi 18 avril 2008 Statut Membre Dernière intervention 19 août 2008
19 août 2008 à 11:47
Salut ymca

J'ai une question à propos de ton code
Je l'utilise à une vitesse de 115200bps, et j'envoie la trame FFAF 10 fois. Lorsque je compile le code et que je demande la réception, j'obtiens :
50 octet(s) reçu(s)
FFAF

Comment se fait il que je ne lis qu'une seule fois ma chaine de caractères (que j'ai envoyée 10 fois), et qu'il me dise que le nombre d'octets reçus soit de 50 ? Je ne comprends vraiment pas

Merci pour votre aide
zak8er Messages postés 1 Date d'inscription jeudi 13 mars 2008 Statut Membre Dernière intervention 13 mars 2008
13 mars 2008 à 16:47
Bonjour très bon programme,je voudrai savoir qu'est-ce que je dois modifier pour envoyer du code ASCII à la place des octets.
Merci de votre réponse.
bracqjean Messages postés 5 Date d'inscription mercredi 7 novembre 2007 Statut Membre Dernière intervention 31 janvier 2008
1 févr. 2008 à 10:15
Très bon programme
julian60 Messages postés 1 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 28 juin 2007
28 juin 2007 à 09:39
Tout simplement super...

Merci
muuller Messages postés 3 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 22 juin 2007
25 juin 2007 à 12:21
Bonjour YMCA,
j'utilise VC++ et j'arrive à le compiler.Cependant,je voudrais envoyer 4 bytes sur le port RS232 pour faire commuter les entrées d'un appareil(matrice de commutation) sur ses sorties.
Les Bytes sont :
1 byte pour le n° de l'instruction
1 byte pour le n° de l'entrée à commuter
1 byte pour le n° de la sortie sur laquelle il faut commuter l'entrée
1 byte pour le n° de la machine.
Ces bytes doivent être envoyés en hexa ou en decimal.
Comment je peut faire ça avec ton prog car hélas, je suis nul en prog
Merci d'avance!!!
misterzinzin Messages postés 112 Date d'inscription vendredi 27 octobre 2000 Statut Membre Dernière intervention 26 janvier 2011 2
15 juin 2007 à 16:59
de mémoire, la fonction de lecture s'arrête automatique après un certain temps même si le port série n'a pas reçu de donnée. est tu sur que ton port série reçoit bien des données ?
cs_ncir Messages postés 4 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 15 juin 2007
15 juin 2007 à 09:30
Bonjour MISTERZINZIN
J'ai bien ajouté si que vous demandez et encore le meme resultat:
Reception des donnees...
0 octet(s) reçue(s):
1244800
Merci pour les explications à venir.
cs_ncir Messages postés 4 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 15 juin 2007
14 juin 2007 à 19:39
Merci MISTERZINZIN
J'essayerais demain parce que je suis un peu loin de labo
Mais pardent moi MISTERZINZIN, je suis un mecanicien, je ne comprend pas trop en ce langage(VC++),
concernat ce ci(#define BOOL int)je le met juste au début du code?

Merci de m'aider
misterzinzin Messages postés 112 Date d'inscription vendredi 27 octobre 2000 Statut Membre Dernière intervention 26 janvier 2011 2
14 juin 2007 à 19:16
ajoute #define BOOL int
au debut du fichier ...
cs_ncir Messages postés 4 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 15 juin 2007
14 juin 2007 à 16:33
En fait, j'ai utilisé ce code.





/******************************************************************************
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 1000 /* 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);

/******************************************************************************
main : point d'entrée du programme.
******************************************************************************/
int main()
{
/* variables locales */
char buffer[256];
int nId, nChoice, 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("2 : Recevoir des donnees.\r\n");
printf("3 : Quitter.\r\n");
printf("Choix : ");
scanf("%d", &nChoice);


/* 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%d\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, (LPDWORD)pBytesRead, NULL);
}
cs_ncir Messages postés 4 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 15 juin 2007
14 juin 2007 à 13:53
Bonjour
Merci pour cette source, c'est une geste de noblesse.
Je viens de tester ton source et j'ai un pti soucis :
je communique avec un détecteur de métal en utilisant un microcontroleur via port série RS232 et je besoin uniquement du l'étape de reception des données (c.a.d présence ou absence de métal). J'ai essayé avec ton source il m'indique toujours c ci:
Reception des donnees...
0 octet(s) reçue(s):
1244800
svp j'ai un travail urgent et merci d'avance
misterzinzin Messages postés 112 Date d'inscription vendredi 27 octobre 2000 Statut Membre Dernière intervention 26 janvier 2011 2
13 juin 2007 à 23:19
bool est surement une déclaration qu'il te manque qq part... met des int a la place ;-)
taras67 Messages postés 5 Date d'inscription jeudi 31 mai 2007 Statut Membre Dernière intervention 12 juin 2007 2
12 juin 2007 à 11:01
Merci pour ta réponse. En fait, d'après les fonctions WriteCom & ReadCom que j'ai trouvé sur cette page, les fonctions writefile et readfile sont sensées retourné des "bool" non? Je déduis ça du fait que les fonctions WriteCom & ReadCom sont du genre:

bool WriteCom(...){
return WriteFile(...);
}

En même temps, je suis vraiment un novice en C, donc je me trompe certainement.
Mais quand j'essaye de me servir de ces fonctions, j'ai une erreur de compilation qui me dit que les fonctions writefile et readfile renvoient des "int" et que la conversion int->bool pose problème. le compilateur précise que :

int__cdecl WriteFile(...)
misterzinzin Messages postés 112 Date d'inscription vendredi 27 octobre 2000 Statut Membre Dernière intervention 26 janvier 2011 2
12 juin 2007 à 10:47
comment peut tu dire que tes fonction renvois des int et pas des bool ? sinon généralement, une fonction (en C) renvois un entier pour signaler si tout c'est bien passé. de plus, en principe il est impossible de renvoyer un bool et on renvois généralement un int (on pourrais mettre un byte mais bon...)
taras67 Messages postés 5 Date d'inscription jeudi 31 mai 2007 Statut Membre Dernière intervention 12 juin 2007 2
11 juin 2007 à 11:18
Bon je suis désolé d'avoir posé ma question "idiote"... En fait... J'ai honte de le dire mais je vais pas laisser chercher quelqu'un sur ce problème alors que la raison de ce problème est simple: j'avais oublié de brancher le cable... la loose. Donc en fait, il reste juste la deuxime question (qui n'empeche pas le prog de fonctionner): Pourquoi mes fonctions writefile et readfile renvoient des "int" alors qu'elles sont sensées renvoyer des "bool". je sais pas si ça peut aider mais j'utilise VC++ et winXP.
Encore désolé pour le msg précédent :p
taras67 Messages postés 5 Date d'inscription jeudi 31 mai 2007 Statut Membre Dernière intervention 12 juin 2007 2
11 juin 2007 à 10:42
Salut!
J'ai un petit souci, j'aimerais envoyé automatiquement des instructions via le RS232. J'ai utilisé ta fonction "writeCOM" pour envoyer le buffer suivant (l'instruction que je dois envoyé est "ldd:?" suivi d'un retour chariot:

char buffer[256];
buffer[0]='l';
buffer[1]='d';
buffer[2]='d';
buffer[3]=':';
buffer[4]='?';
buffer[5]='/n';
buffer[6]='/0';
Ensuite j'envoie le buffer en utilisant writeCOM. Enfin, je fais un readCOM pour récupérer la réponse de mon bidule branché sur le port série. Apparemment tout se passe bien puisque chaque fonction me renvoie des "true" mais le buffer renvoyé par readCOM est vide...

J'ai un autre problème (qui pourrait expliqué le premier), mes fonctions writefile et readfile renvoie des "int" et non des booléens. J'ai fait les modifs adéquates pour que sa compile correctement mais du coup, je suis pas sûr que ces fonctions fassent le bon boulot... Je suis un peu perdu là donc si quelqu'un pouvait m'aider...
Merci d'avance,
misterzinzin Messages postés 112 Date d'inscription vendredi 27 octobre 2000 Statut Membre Dernière intervention 26 janvier 2011 2
10 juin 2007 à 09:12
tu devrai plutot utiliser tcp/ip avec les sockets.
en cherchant un peut tu devrai trouver facilement et en plus tu pourrais même transmettre tes fichier a travers internet...

sinon pour le port série, fait gaffe que chaque pc doit avoir la même configuration du port (vitesse, parité, nombre de bit d'arrêt, contrôle de flux)
et aussi que le cable doit être croisé.
un bon moyen pour tester la liaison est d'utiliser hyper terminal sur les 2 pc sur le port com 1 (ou autre en fonction du pc) et de taper du texte pour voir s'il apparait sur l'autre écran ;-)

et pour avoir de l'aide sur ton programme tu devrai peut etre le mettre sur ce site... parce que "mon programme ne marche pas, merci de m'aider" ca n'est pas très parlant ;-)
charifsba3i Messages postés 1 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 31 mai 2007
31 mai 2007 à 20:30
Bonjour,
Merci pour ce code

je voulais savoir comment on peut faire pour transmitre un fichier texte qui existe sur mon disque vers un autre pc
j'ai essayé modifier ce code pour réaliser cette fonction mais j'ai pas réussi.

Merci de m'aider.
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
17 avril 2007 à 19:44
Le port COM doit demandé a être ouvert par le téléphone via une application JAVA.
Gy0m Messages postés 4 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 17 avril 2007
17 avril 2007 à 10:46
J'y ai branché un téléphone mobile, c'est un port USB en fait.
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
16 avril 2007 à 22:34
Tout dépend à quoi te sert le COM13..
Gy0m Messages postés 4 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 17 avril 2007
16 avril 2007 à 09:51
Bonjour

Je vien de tester ton programme, avec les port COM1 et COM2 ca marche nikel, mais je souhaite communiquer avec le port COM13 mais il n'arrive pas a ouvrir le port COM13...

Si quelqu'un sait d'ou cela peut venir, je suis prenneur!!!!

++
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
6 mars 2007 à 16:36
Bravo je met 10/10 ce qui te fait passe de 9.67 à 9.71 !
Super Source et encore bravo !
skraati Messages postés 1 Date d'inscription mercredi 3 janvier 2007 Statut Membre Dernière intervention 6 janvier 2007
6 janv. 2007 à 06:17
bonjour,
J'ai utilisé un logiciel pour communiquer avec une balance et ça a marché(il y a un cable qui relie le pc et la balance).Maintenant,je dois les relier par modem de type "OLITEC self memory 33600" et la communication entre la balance et le pc ne passe pas.
Quelqu'un peut-il m'aider pour ça?
merci.
cs__Syl_ Messages postés 66 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 25 février 2008 2
7 déc. 2006 à 15:44
Top !
cs_arb Messages postés 40 Date d'inscription lundi 18 février 2002 Statut Membre Dernière intervention 5 novembre 2012 4
23 nov. 2006 à 08:30
Salut

Super ce bout de code. Je communique avec un microcontrolleur sur une carte externe. J'ai juste un souci à 115200 pour la vitesse. 57600 ça passe, mais pas plus haut !!!
Pourtant je n'ai pas de soucis côté carte car j'ai un logiciel en Visual Basic qui communique à 115200.
Par contre je n'utilise aucun control de flux, peut être faut il faire des modifs dans l'init de la structure DCB. j'envoie 129 octets à 115200 pour info.
Merci de votre aide, ou de pistes pour m'aiguiller car je suis sec !!!!
yous1981 Messages postés 6 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 23 novembre 2006
23 nov. 2006 à 01:55
bonjour
jai deja adapter ce code pour envoyer des sms par un modem GSM/GPRS et samarchait nikel tu me laisse ton mail je te lenvoye dans les jours ki viennent
bon courage
cs_clipper Messages postés 1 Date d'inscription mercredi 10 avril 2002 Statut Membre Dernière intervention 22 novembre 2006
22 nov. 2006 à 16:27
Bonjour,

J'ai moi aussi un souci d'utilisation de ce code
J'ai un modem GSM auquel j'envois une commande AT+CSQ
et j'attends une réponse du style +CSQ : 31,0.
J'envois ma commande par l'option 1,
mais il me retourne ma commande.

Pour info quand je suis en réception je reçois des éléments
à la mise sous tension du modem.

Merci pour les explications à venir.

:-)
cs_moniteur Messages postés 4 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 22 décembre 2008
22 sept. 2006 à 23:50
Merci pour cette petite source.
Elle nécessite quelques modifications pour être utilisable mais elle pose les bases et le minimum vital à savoir sans code superflue.
cs_arb Messages postés 40 Date d'inscription lundi 18 février 2002 Statut Membre Dernière intervention 5 novembre 2012 4
20 sept. 2006 à 14:06
Salut

Super ce bout de code. Je communique avec un microcontrolleur sur une carte externe. J'ai juste un souci à 115200 pour la vitesse. 57600 ça passe, mais pas plus haut !!!
Pourtant je n'ai pas de soucis côté carte car j'ai un logiciel en Visual Basic qui communique à 115200.
Par contre je n'utilise aucun control de flux, peut être faut il faire des modifs dans l'init de la structure DCB. j'envoie 129 octets à 115200 pour info.
Merci de votre aide, ou de pistes pour m'aiguiller car je suis sec !!!!
yous1981 Messages postés 6 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 23 novembre 2006
7 sept. 2006 à 17:02
cest ce que jutilise pour envoyer des commande vers des modem de transmission de données et ca marche nikel:
WriteCOM("commande\r\n", strlen("commande\r\n"), &nBytesWritten);
tiluz Messages postés 10 Date d'inscription mardi 5 septembre 2006 Statut Membre Dernière intervention 20 septembre 2006
7 sept. 2006 à 16:40
mon prog est celui du haut de la pagge (TESTcom.c)
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 sept. 2006 à 16:34
Aucune idée de ton prog mais je ferais ainsi:

Edit d'envoi sous classé pour intercepter le ENTER clavier et que le retour charrit ne s'insère pas.
Dans editProc quand tu interceptes ENTER:
char *psz;
int len;
len = GetWindowTextLenght(hedit);
psz = (char*) malloc(len + 3);
GetWindowText(hedit, psz, len + 1);
psz[len] = '\r'; psz[len+1] = '\n'; psz[len+2] = 0;
JappelleMaFuncDenvoi(psz, len + 2);
free(psz);
SetWindowText(hedit, 0); // VIDANGE LE TEXTE
return 0;
tiluz Messages postés 10 Date d'inscription mardi 5 septembre 2006 Statut Membre Dernière intervention 20 septembre 2006
7 sept. 2006 à 16:13
Je dois le taper dans la fen^tre de commande après les caractère que j'envoie ou modifier le code???????????
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 sept. 2006 à 15:36
A l'endroit sera aussi bien: "\r\n"
tiluz Messages postés 10 Date d'inscription mardi 5 septembre 2006 Statut Membre Dernière intervention 20 septembre 2006
7 sept. 2006 à 15:35
Par exemple lorque j'envoie une chaîne de caractère avec labview dans la fenêtre d'ecriture je tape ENTER ä la fin de mon message, et quand je l'envoie au récepteur (robot)celui ci comprend qu il sgit d'une instruction. Sans ce saut de ligne après la chaîne de caractères le robot recoit le message mais n'agit pas.
tiluz Messages postés 10 Date d'inscription mardi 5 septembre 2006 Statut Membre Dernière intervention 20 septembre 2006
7 sept. 2006 à 15:30
En fait j'aimerais le faire directement dans la fenêtre de commande pour que le saut de ligne soit envoyé à la fin du message par le port série jusqu au recepteur
yous1981 Messages postés 6 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 23 novembre 2006
7 sept. 2006 à 14:54
tu ajoute "/n/r" au message soit directement soit par la fonction strcat
tiluz Messages postés 10 Date d'inscription mardi 5 septembre 2006 Statut Membre Dernière intervention 20 septembre 2006
7 sept. 2006 à 13:29
Linefeed (LF) est un caractère saut de ligne (ascii)
retourné lorsque l'on presse ENTER.
BassoV13 Messages postés 3 Date d'inscription lundi 5 avril 2004 Statut Membre Dernière intervention 6 septembre 2006
6 sept. 2006 à 17:14
merci pour tout maintenant ca marche ...
yous1981 Messages postés 6 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 23 novembre 2006
6 sept. 2006 à 16:41
cest quoi "linefeed"?????????????????
tiluz Messages postés 10 Date d'inscription mardi 5 septembre 2006 Statut Membre Dernière intervention 20 septembre 2006
6 sept. 2006 à 12:06
Comment faire pour ajouter un "linefeed" après les caractères envoyé.

QQ1 Peut m'aider??????????????????????
yous1981 Messages postés 6 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 23 novembre 2006
26 juil. 2006 à 17:58
Il faut déclarer buf en tant que unsigned char: unsigned char buf[tail_buf].
bon courage.
ThibB Messages postés 1 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 25 juillet 2006
25 juil. 2006 à 16:07
J'ai un peu la même question que toi Rin01, c'est à dire que je n'arrive pas vraiment à traiter les données que je recoit ...
Je suis parti de ce code pour créer un programme permettant de communiquer avec un GPS Bluetooth, et je voudrais à chaque paquet que je recoit vérifier qu'il est un format de trame correct.

Théoriquement ceci :
ReadCOM(buffer, 9, &nBytesRead);
printf("buf[0] : %.2X - buf[1] : %.2X\n",buffer[0],buffer[1]);

Devrait afficher cela (je verifie les données recu à l'aider d'un sniffer):
buf[0] : AA - buf[1] : 55

Mais ca affiche quelque chose comme (change à chaque execution, la reponse est pourtant toujours la même) :
buf[0] : F1 - buf[1] : AF

Est ce quelqu'un aurait une explication ? Merci ;)
rin01 Messages postés 3 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 juillet 2006 2
19 juil. 2006 à 10:37
Bonjour,
Merci pour ce code qui m'a bien aidé.
J'aimerai savoir quel est le type de données reçues?
dans la déclaration il y a un "void *buffer" et si on souhaite récupérer les données sous forme d'entier ou hexa, est-ce que quelqu'un sait comment faire svp?
yous1981 Messages postés 6 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 23 novembre 2006
3 mai 2006 à 10:20
salut tout le monde,
j'ai un souci avec le programme de YMCA2003,j'arrive pas à lire mes données sur le port par contre j'arrive à ecrire,en fait, avant de connecter mon pc à un modem via RS232 ,je veux verifier au debut que le port fonctionne comme il faut,je transmets la trame des donnees par un pc et j'essaye de la recevoir par un autre,le probleme c'est que le programme m'affiche" 0 octet recu" jai verifier avec un oscillo que le signal est bien present à l'entrée du port du pc recepteur.Je vous attends messieurs les programmeur si vous avez des solutions à me proposer.
KaYaStar Messages postés 4 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 11 juin 2006
9 mars 2006 à 13:15
Et sous linux, personne ne sait comment on fait?
Svp
car je dois récupere les données d'une centrale météo via la liaison rs 232, mais pas moyen !
Merci de votre aide
BassoV13 Messages postés 3 Date d'inscription lundi 5 avril 2004 Statut Membre Dernière intervention 6 septembre 2006
4 mars 2006 à 00:35
salut, je viens de tester ton source et j'ai un pti soucis :
Je communique avec un GPS et par exemple je lui envoie la commande AT+LOCIDT? et lui doit me renvoyer ceci -> +LOCIDT: "354475000033841"

J'envoie donc la commande avec l'option 1 mais rien ne s'affiche en retour avec l'option 2. En mode debug je vois que dans buffer il y a juste ma commande AT+LOCIDT? mais pas la reponse.
D'ou cela peut-il venir ?
Merci par avance
dushit Messages postés 44 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 11 août 2006
14 févr. 2006 à 13:39
salut,
je voulais savoir comment en fesait pour transormer les donnee recu en hexa en binaire car la photo doit "etre remplie de donnee binaire" .
Merci d'avance
dushit
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
8 févr. 2006 à 19:20
oui c'est possible.
dushit Messages postés 44 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 11 août 2006
8 févr. 2006 à 13:04
est ce que lon peu faire ca
WriteCOM("\xAA\x01\x05\x00\x00\x00", 6, &nb);
ou fau passr par char buffer[]
Merci }
dushit Messages postés 44 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 11 août 2006
8 févr. 2006 à 13:03
est ce que je peu faire ca:
WriteCOM("\xAA\x01\x05\x00\x00\x00", 6, &nb);
il fau passer par char buffer[]??
Merci
}
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
8 févr. 2006 à 08:54
buffer est déclarer 2 fois.
Pour en utiliser 2 différents, il faut leur donner des noms différents.
De plus, en C les déclarations de variables doivent être en début de bloc.
dushit Messages postés 44 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 11 août 2006
7 févr. 2006 à 20:40
jai fai ca mai jai une erreur que jarrive pa a voir!!


if(nChoice == 0)
{
//envoi init
char buffer [] = "\xAA\x01\x00\x07\x07\x07";
int nb;
WriteCOM(buffer, 6, &nb);
//recoi ack
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");
}
//envoi getpicture ERREUR ICI: error C2143: syntax error : missing ';'

//before 'type'
char buffer [] = "\xAA\x04\x05\x00\x00\x00";
WriteCOM(buffer, 6, &nb);
//recup image
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");
}

sinon est ce que le int nb c le mm, je le declare une seul fois??
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
7 févr. 2006 à 19:14
char buffer [] = "\xAA\x01\x05\x00\x00\x00";
int nb;
WriteCOM(buffer, 6, &nb);
dushit Messages postés 44 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 11 août 2006
7 févr. 2006 à 18:02
par exemple, si je veut envoyer AA0105000000 en dur je code ca comment?
et pour afficher le ack sur la console?
dans:

BOOL WriteCOM(void* buffer, int nBytesToWrite, int* pBytesWritten)
{
/* écriture sur le port */
return WriteFile(g_hCOM, buffer, nBytesToWrite, (DWORD*)pBytesWritten, NULL);
}

je modifie koi?
car c le buffer qui est ecrit? donc il faut que j'initialise le buffer avec mon code hexa??
Merci
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
7 févr. 2006 à 17:00
déclare :
char trame [] = "\xf7\xe5\x35";
pour 0xf7, 0xe5, 0x35
dushit Messages postés 44 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 11 août 2006
7 févr. 2006 à 15:50
salut,
je voulais savoir comment faire pour envoyer des trames en hexa mais coder en "dur".
car je dois envoyer une trame de conf puis recevoir la ack, puis reenvoyer une trames pour prendre la photo et enfin recevoir les bits qui constitue la photo.
tout cela doit etre dans 1 seul menu ( jai rajouter en 0 : envoie/recoie).
je pensai a une writecom(), readcom() ou il faut afficher le ack sur la console, un writecom() puis la fonction readcom() avec la creation du fichier jpeg.
Mais dans writecom() je mai quoi en parametre pour coder en "dur" et en hexa?
Merci d'avance de ton aide.
Dushit
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
17 janv. 2006 à 19:08
HANDLE hFile = CreateFile("toto.jpg", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
WriteFile(hFile, buffer, *pBytesRead, &dw, NULL);
CloseHandle(hFile);

ou

FILE* f = fopen("toto.jpg", "wb");
fwrite(buffer, 1, *pBytesRead, f);
fclose(f);

l'ouverture doit se faire au début du prog;
la fermeture à la fin;
l'écriture dans la fct de lecture
dushit Messages postés 44 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 11 août 2006
17 janv. 2006 à 18:39
mai qd je compile readCom ca me met cette erreur : error C2065: 'hFile' : undeclared identifier dc je voi pa comment faire.
desole de te saouler avec ca , mai je suis vraiment nul en programmation...
Merci bcp en tous cas!
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
17 janv. 2006 à 18:22
le hFile est un HANDLE ouvert par CreateFile
tu peux utiliser FILE* f avec fopen et fwrite
dushit Messages postés 44 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 11 août 2006
17 janv. 2006 à 17:55
Merci de repondre aussi vite , c'est tres gentil.
j'ai une petite erreur en compilant , pour declarer le fichier c'est FILE* hfile?? je sais plus trop.
de plus , mon fichier etant un .jpg , je doit faire comment pour le sauvergarder en .jpg.
(l'erreur c'est: error C2065: 'hFile' : undeclared identifier).
Merci beaucoup
dushit
dushit Messages postés 44 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 11 août 2006
17 janv. 2006 à 17:55
Merci de repondre aussi vite , c'est tres gentil.
j'ai une petite erreur en compilant , pour declarer le fichier c'est FILE* hfile?? je sais plus trop.
de plus , mon fichier etant un .jpg , je doit faire comment pour le sauvergarder en .jpg.
(l'erreur c'est: error C2065: 'hFile' : undeclared identifier).
Merci beaucoup
dushit
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
17 janv. 2006 à 15:49
BOOL ReadCOM(void* buffer, int nBytesToRead, int* pBytesRead)
{
DWORD dw;
BOOL res = ReadFile(g_hCOM, buffer, nBytesToRead, (LPDWORD)pBytesRead, NULL);

WriteFile(hFile, buffer, *pBytesRead, &dw, NULL);

return res;
}

hFile étant le fichier de destination tu peux également utiliser fwrite.
les données étant dans buffer et de longueur *pBytesRead
dushit Messages postés 44 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 11 août 2006
17 janv. 2006 à 14:05
bonjour,
je voulais savoir comment on peut faire pour recuperer les donnees recu (elle sont binaire normalement??) puis les ecrire dans un fichier. C'est pour recupere une photo prise par une camera brancher sur le port serie et qui se commande avec des trames hexa.

Merci
dushit
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
12 janv. 2006 à 05:24
donnnées à écrire en hexa et majuscule,
ex :
01AB42BEF4

/* envoyer des données */
if(nChoice == 1)
{
unsigned char tmp[256];
int i, len;

printf("\r\n");
printf("Donnees a envoyer :\r\n");
fflush(stdin);
gets(buffer);
printf("\r\n");
printf("Envoi des donnees...\r\n");

len = strlen(buffer);
for(i = 0; i < len/2; i++)
{
tmp[i] = (buffer[2*i] <= '9') ? buffer[2*i]-'0' : buffer[2*i]-'A'+10;
tmp[i] = (tmp[i]<<8) | ((buffer[2*i+1] <= '9') ? buffer[2*i+1]-'0' : buffer[2*i+1]-'A'+10);
}

if(WriteCOM(tmp, len/2, &nBytesWritten))
printf("%d octet(s) envoye(s).\r\n", nBytesWritten);
else
printf("Erreur lors de l'envoi.\r\n");
}
dushit Messages postés 44 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 11 août 2006
10 janv. 2006 à 18:59
on fai comment pour envoyer en hexa depuis la console
faut modofier koi dans le code??
merci bcp
dushit
dbiare Messages postés 45 Date d'inscription mercredi 30 novembre 2005 Statut Membre Dernière intervention 6 janvier 2006
6 déc. 2005 à 17:13
J'ai perdu une semaine de développement à cause de la gestion des ports qui est différente sous XP par rapport à 98 et c'est ce source qui m?a sauvé !
Il est trop TOP !!! Trop top parce que efficace et très simple donc facilement implantable dans une application perso
misterzinzin Messages postés 112 Date d'inscription vendredi 27 octobre 2000 Statut Membre Dernière intervention 26 janvier 2011 2
15 oct. 2005 à 21:01
heureuxque ma source t'ai servi a qq chose nitrique.

cependant je dois relancer cet honneur un niveau plus haut car je n'ai fait qu'englober ces ligne de code dans une classe. toute les source viennent de ce site... enfin je pense
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
14 oct. 2005 à 09:42
En fait, j'ai trouvé (Grace à la source de misterzinzin)

J'ai fait:
sprintf(szCOM, "\\\\.\\COM%d", nId); // Modifie pour prendre les port com>9
et FILE_ATTRIBUTE_READONLY dans CreateFile();

Et ca marche !
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
14 oct. 2005 à 09:30
Bonjour et merci pour ce code Bien pratique.
Seulement, pour mon cas, il y a des choses qui ne vont pas:

Je doit me connecter sur un port virtuel (Port USB qui simule un port COM) et ça ne fonctionne pas, il ne peut pas se connecter:
g_hCOM = CreateFile(szCOM,GENERIC_READ |GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM,NULL); // Plante
J'ai donc essayé de changer qq paramètres:
g_hCOM = CreateFile(szCOM,GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_READONLY,0);
Car je n'ai besoin que de lire sur ce port, mais sans grands résultats.
misterzinzin Messages postés 112 Date d'inscription vendredi 27 octobre 2000 Statut Membre Dernière intervention 26 janvier 2011 2
9 sept. 2005 à 21:05
http://www.cppfrance.com/code.aspx?ID=33724

j'ai fait une version c++ (dans une classe) merci pour ton aide ymca...

ps: j'ai ajoute 2 ou 3 modif que j'ai trouvé dans ces commentaire et dans d'autre sources...

souyez indulgent... j'ai fait cette classe en une soiree en face de star academy...
cs_zizo1 Messages postés 2 Date d'inscription vendredi 8 juillet 2005 Statut Membre Dernière intervention 18 juillet 2005
18 juil. 2005 à 14:17
Merci Nix,Pour votre aide.
Est ce que qq'un peut m'aider à savoir la nomenclature des broches d'un port COM/paralléle.

zizo1...?
rakma Messages postés 10 Date d'inscription dimanche 12 décembre 2004 Statut Membre Dernière intervention 4 novembre 2008
15 juin 2005 à 10:05
J'ai trop honte, je crois que j'ai touché le fond :)
En fait j'avais collé cet extrait à l'exterieur du main, c'est sur que à l'interieur, ca marche tout de suite mieux !!!
En suite j'ai changé le hCom en g_hCOM pour pouvoir l'utiliser avec ton code, ca marche super bien !!!
Merci beaucoup pour ton aide YMCA2003, j'avais vraiment besoin de connaitre le nb d'octets dans le buffer de lecture ...
Bon courage pour la Suite !
Rakma
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
15 juin 2005 à 09:35
Alors là je vois pas trop. Il y a peu-être un ; manquant à la ligne d'avant ou le nom d'une variable qui n'est pas correct (ceux que j'ai mis sont des exemples genre hCom).

Si tu mettait un peu de code au dessus et en dessous de cette ligne je pourrais peu-être d'aider.
rakma Messages postés 10 Date d'inscription dimanche 12 décembre 2004 Statut Membre Dernière intervention 4 novembre 2008
15 juin 2005 à 09:26
YMCA2003,
Merci pour ta réponse si rapide !!!!!
Je suis désolé, je vais encore t'embeter une fois. Ce n 'est pas de ma faute :)), c'est Dev-C++ qui est suceptible ;)

Pour la ligne concernant " ClearCommError(hCom, &dwErrors, &cs); "
Il me met :

81 expected constructor, destructor, or type conversion before '(' token
81 expected `,' or `;' before '(' token

Tu aurais une idée d'ou cela peut venir ??
Merci d'avance !!
Rakma
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
14 juin 2005 à 08:58
Pour savoir le nombre d'octets prêt à lire :
COMSTAT cs = {0};
DWORD dwErrors;
ClearCommError(hCom, &dwErrors, &cs);

=> cs.cbInQue contient le nombre d'octets pret à lire.
=> permet de lire directement le bon nombre.
rakma Messages postés 10 Date d'inscription dimanche 12 décembre 2004 Statut Membre Dernière intervention 4 novembre 2008
13 juin 2005 à 23:39
ymca2003,

Je tiens à te remercier pour ton code source, je l'utilise pour une communication entre mon PC et un micro controlleur. Je t'ai d'ailleurs mis dans ma page des remerciements dans un de mes sites Internet.
J'aurais une petite question à te poser. Est il possible avec ce code source de connaitre le nombre d'octets qui sont dans le buffer de lecture, prêt à être lu?
Merci d'avance.
Séphane(Rakma).
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
9 juin 2005 à 15:42
Comme un peu plus haut dans les réponses, il y A 2 casts à faire
les 2 casts à faire sont :

return ReadFile(g_hCOM, buffer, nBytesToRead, (DWORD*)pBytesRead, NULL);

return WriteFile(g_hCOM, buffer, nBytesToWrite, (DWORD*)pBytesWritten, NULL);
novice54 Messages postés 7 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 9 juin 2005
9 juin 2005 à 14:27
Salut YMCA2003,
j'essaie d'utiliser ton programme car je dois faire communiquer le PC avec un régulateur de four mais j'ai un problème de compilation au niveau de ReadCOM et WriteCOM: ça me met
"invalid conversion from int* to 'DWORD*'
Je t'avoue que je n'y comprends rien. J'ai essayé sous VC++ et devC++ et ça me met la même erreur.
Merci de m'aider
cs_pirana Messages postés 17 Date d'inscription dimanche 8 juin 2003 Statut Membre Dernière intervention 16 juin 2005
12 avril 2005 à 10:22
Bonjour ymca2003, merci pour ce super code ...
Je suis relativement débutant dans le domaine de la programmation

J'essaye d'envoyé la trame suivante:

1 octet de prise de controle (du PIC que je voudrais commander) : 13

attente de 50 ms

1 octet de réponse : OK : 06

comparer l'octet recu

émission du 2048 octets

avec 0.5ms d'attente apres chaques octets envoyés.


Et recevoir la trame suivante:

1 octet de controle 13

reception de 2048 octets découpés par mot de 8octets et stocké dans un tableau

1 octet de fin


Merci Andr0
cs_loto Messages postés 1 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 23 février 2005
23 févr. 2005 à 17:01
Yep!
J'ai un petit soucis avec ton programme. Lorsqu'on envoie les données on les recoit accompagnées de plein de chiffres qui reviennent. Je comprend pas trop ce qu'il se passe, j'envoie notre code pour voir si qqun arrive a trouver notre problème.
Pour info le programme nous servira à lire des nombres binaires qui sortent d'une carte de transmission fabriqués par nos soins.

Voila le code :


/******************************************************************************
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>
#include <string.h>
#include <math.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 */
75, /* 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 puissance (int i){
int Tmp =1, n ;
for (n=0; n<i; n++){
Tmp = Tmp*2;
}
return Tmp;
}





int main()
{
/* variables locales */
int buffer[10];
int Nb,a,i, 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("2 : Envoyer des donnees.\r\n");
printf("3 : Recevoir des donnees.\r\n\n");
printf("4 : Quitter.\r\n");
printf("Choix : ");
scanf("%d", &nChoice);


/* envoyer des données */
if(nChoice == 2)
{
printf("\r\n");
printf("Donnees a envoyer :\r\n");
fflush(stdin);
scanf("%d",&buffer);
printf("\r\n");
printf("Envoi des donnees...\r\n");
if(WriteCOM(buffer, 10, &nBytesWritten)) {
WriteCOM(buffer, 10, &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 == 3)
{
printf("\r\n");
printf("Reception de donnees...\r\n");
if(ReadCOM(buffer, 10, &nBytesRead))
{
//buffer[nBytesRead] = '\0';
//printf("le nombre est %d \r\n", buffer);
//for(int i = 0; i < nBytesRead; i++)
for(int i = 0; i < 10; i++)
printf("%d", buffer[i]);
}
else
printf("Erreur lors de la réception.\r\n");
}
}while(nChoice != 4);

/* 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, (DWORD*)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, (DWORD*)pBytesWritten, NULL);
}
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
13 janv. 2005 à 18:01
Si ça marche avec serial, cela doit pouvoir marcher avec l'exemple de base.

Pour envoyer la commande à un intervalle de temps régulier il va falloir un timer.

en gros ce qu'il faut :
- avoir une variable global avec la commande à envoyer (un tableau de BYTE et une variable qui donne le nombre d'octets.
- ouvrir le port avec les bons paramètres (vitesse...)
- créer un Timer avec SetTimer et donner un pointeur sur une fonction TimerProc qui sera appelée régulièrement (pas besoin de fenêtre HWND).
- dans cette fonction, appeler WriteCom avec le buffer global de la commande.

pour la réponse il y a 2 possibilités :
- faire un thread qui s'occupera de lire tout ce qui est reçu sur le port et de le sauvegarder quelque part.
- appeler ReadCom juste après avoir envoyer la commande en paramétrant MAX_WAIT_READ pour attendre un délai max la réponse.

pour l'enregistement dans un fichier, il suffit d'écrire dedans les buffers (envoyés ou reçus.
hxpicard Messages postés 2 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 13 janvier 2005
13 janv. 2005 à 17:47
Merci, ca fonctionne très bien avec ton programme Serial. En meme temps, il y a t'il un moyen facile de lui faire faire la meme commande a une meme intervalle de temps en d'enregistrer ces résultats dans un fichier? Si des fois tu peux me donner un petit coup de pouce pour faire ça je serais bien contant

merci
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
13 janv. 2005 à 16:54
Essaye avec Serial (dans mes sources), un prog plus complet qui permet de communiquer avec un appareil connecté au RS232 en tapant des commandes.

Sinon, vérifier les paramètres du port (vitesse en particulier)
hxpicard Messages postés 2 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 13 janvier 2005
13 janv. 2005 à 16:47
Salut, j'asseiller d'utiliser ton programme pour envoyer et recevoir des commandes d'un Omegabus D1131. mais ça ne marche pas. je suis pas un grand spécialiste de la communcation RS232 en C++. j'aimerais savoir si tu aurais une idée de comment modifier le soft pour le faire fonctionner avec mon convertisseur. Merci

email: hugo.picard@usherbrooke.ca
wajih_ml Messages postés 5 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 27 novembre 2004
24 nov. 2004 à 23:22
salut ymca2003

en fait j'ai un projet de fin d'etude qui consiste a communiquer
avec une centrale de mesure "recdigit POWER" via un adaptateur rs485/rs232
et cela suivant le protocole modbus/jbus
le probleme que le programme "TestCOM.c" ne marche po : il me renvoi les meme donnees que
j' ai deja transmi .
est ce que cette source marche avec une communication "pc/central de mesure" sous modbus?
as tu une solution ou eventuellement un code source qui peut marcher avec ce type de communication

exemple trame a envoyer:

05(n esclave)|03(n fonction)| 00 38(adresse 1er mot:2octet)|00 02(nombre de mot:2octet)|44 42 (crc:2octet)

trame a recevoir(reponse):
05(n esclave)|03(n fonction)| 04(nb d'octet lus)|PFORT1 pfaibe1(valeur mot n1)|PFORT2 pfaibe2(valeur mot n1)|CRC - -


sinon j'ai pas bien compri cette portion du code:

BYTE buffer[256];
buffer[0] = addr;
buffer[1] = fct;
memcpy(&buffer[2], data, n);
*((WORD*)(&buffer[2+n])) = crc16;

int BytesWritten;
WriteCOM(buffer, n+4, &BytesWritten)

pouvez vous m'envoyer (dans le 4UM ou par e-mail) la place dans le programme principal
ou je peut introduir cette portion de code.

E-MAIL : wajih_ml@lycos.com

Mille merci ..
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
22 nov. 2004 à 14:45
BYTE addr = 0x1;
BYTE fct = 0x3;
BYTE data[] = "\x15\x23\x16";
int n = sizeof(data)/sizeof(data[0]);
WORD crc16 = 0x1296;

BYTE buffer[256];
buffer[0] = addr;
buffer[1] = fct;
memcpy(&buffer[2], data, n);
*((WORD*)(&buffer[2+n])) = crc16;

int BytesWritten;
WriteCOM(buffer, n+4, &BytesWritten)
wajih_ml Messages postés 5 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 27 novembre 2004
22 nov. 2004 à 14:39
salut ymca2003

comment utiliser ton program pour envoyer cette trame:
1 octet pour l'adresse
1 octet pour code fonction
n octet pour chanp de donnee
2 octet pour le crc16

exemple
01 03 152316 1296 (en hexadecimal)

merci d'avance
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
11 oct. 2004 à 18:28
il faut faure une boucle d'affichage :
for(int i = 0; i < nBytesRead; i++)
printf("%02X ", buffer[i]);
cs_Maxaks Messages postés 4 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 5 décembre 2004
11 oct. 2004 à 11:49
C'est du binaire apparement, j'ai alors remplacé le %s du printf() par %x pour afficher le buffer en hexa (c'est comme ca qu'on fait non ? ^^ )

du coup ca m'affiche des résultats plus ou moins louches :

Reception de donnees...
8 octet(s) recu(s) :
22fe78


Reception de donnees...
0 octet(s) recu(s) :
22fe78


:)
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
10 oct. 2004 à 16:52
les octets reçus correspondent à des données binaires ou à des caractères ASCII ?
- 1 er cas : afficher le code hexa des octets dans une boucle.
- 2nd cas : ajouter un caractère nul à la fin et afficher comme une chaîne.
cs_Maxaks Messages postés 4 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 5 décembre 2004
10 oct. 2004 à 13:06
Salut

J'ai un leger souci avec ton code, le truc c'est quà la récéption je n'arrive pas a afficher les données du buffer, je recois des octets mais je n'arrive pas a les afficher en gros

Il se peut aussi que ca viennent de la carte que j'ai branché au pc, mais je 'nai aucun moyen de verifier :(

Merci d'avance
sebby_06200 Messages postés 13 Date d'inscription vendredi 2 juillet 2004 Statut Membre Dernière intervention 3 août 2004
8 juil. 2004 à 17:00
Autant pour moi
je viens de trouver grace a l aide de ymca2003 qui m avai envoyé un mail avec des explications en plus
désolé
sebby_06200 Messages postés 13 Date d'inscription vendredi 2 juillet 2004 Statut Membre Dernière intervention 3 août 2004
8 juil. 2004 à 15:48
bonjour
ce prog utilise les threads?
parce que je dois bloquer l'exec du prog tant quon n'a pas envoyé un octet
j ai essayé de placer dans le tableau buffer un caractère qui, tant qu'il n'est pas changé entraine un Sleep puis des qu'il change, l'exec continue (il est remplacé par le caractère correspondant à l'octet envoyé)
voici le prog
(je suis pas sur d'avoir absoluement tout compris, si des commentaires que j'ai rajouté sont faux n'hésitez pas à m'expliquer) merci beaucoup par avance

/* 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>
/*Dos Specific functions in conio.h Not very portable as conio.h is NOT in the
ANSI standard library and does not appear on the Sun or Linux machines. */

/*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 90 /* temps max d'attente pour lecture (en ms) */
/*On prend un temps de 90 ms car il faut à la centrale un retour qui intervient
avant 100 ms pour réaliser le café*/

/*paramètres de configuration du port série RS232 par défaut*/
#define BAUD 1200
#define NBBITS 8
#define BITSSTOP TWOSTOPBITS
#define PARITE EVENPARITY
/*différents types de parités: NOPARITY EVENPARITY(paire) ODDPARITY(impaire)*/
/*Rem: il y en a d'autres*/

/*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 */
BAUD, /* 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 */
NBBITS, /* ByteSize */
PARITE, /* Parity */
BITSSTOP, /* 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[2];
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 : Dialoguer avec machine.\r\n");
printf("4 : Quitter.\r\n");
printf("Choix : ");
scanf("%d", &nChoice);

/* envoyer des données */
if(nChoice == 1)
{
printf("\r\n");
printf("Donnees a envoyer :\r\n");
fflush(stdin); /*write all buffered data for the given output*/
gets(buffer); /*get string from keyboard*/
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");
/*On doit attendre que l'utilisateur appuie sur une touche*/
buffer[0]='a';

do
{
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 reception.\r\n");
Sleep(100);
}
}while(buffer[0]=='a');
}

if(nChoice == 3)
{
printf("commander un cafe avec le boitier\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);
printf("char qui a ete pris en compte: %c\n",buffer[0]);
}
else
printf("Erreur lors de la reception.\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");
}
}while(nChoice != 4);

/* 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]; /*Pourquoi 16 ?*/

/* construction du nom du port, tentative d'ouverture */
sprintf(szCOM, "COM%d", nId);
/*O/P data in the same way as 'printf' but put it into a string.*/
g_hCOM = CreateFile(szCOM, GENERIC_READ|GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL);
/*permet de créer un fichier pour y écrire et y lire des données*/
/*
szCOM -> ame of the file or other allowed object to create or open
GENERIC_READ|GENERIC_WRITE -> Allow the program to read/write data from the file or other object
0 -> security attributes (0 for Windows > 95)
OPEN_EXISTING -> Open an existing file
FILE_ATTRIBUTE-_SYSTEM -> A system file, used exclusively by the operating system
*/

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, (LPDWORD)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, (LPDWORD)pBytesWritten, NULL);
}
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
7 juil. 2004 à 10:37
les 2 casts à faire sont :

return ReadFile(g_hCOM, buffer, nBytesToRead, (DWORD*)pBytesRead, NULL);

return WriteFile(g_hCOM, buffer, nBytesToWrite, (DWORD*)pBytesWritten, NULL);
sebby_06200 Messages postés 13 Date d'inscription vendredi 2 juillet 2004 Statut Membre Dernière intervention 3 août 2004
6 juil. 2004 à 13:47
Bonjour ymca2003,
moi aussi j ai du mal avec devc++
c pour ca que je te dérange avec mon mail
j essaie de faire marcher le prog soit disant simple qui est en ligne sur le forum j avais la meme erreur que toi et je l ai résolu avec un cast
par contre j arrive pas à l'exécuter et comme j ai du mal à comprendre comment marche le prog j aimerais le voir marcher pour que ca m aide un peu

merci beaucoup d avance parce que je suis vraiment just au niveau du timing
au fait tu peux directement m ecrire a cette adresse: www.sebby@wanadoo.fr
merci et a+
johnbalaise Messages postés 2 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 6 juillet 2004
6 juil. 2004 à 11:07
bonjour

jâi le meme pb avec int* en DWORD* et j'ai pas trop compris ta réponse. On fait comment ton cast ?
Merci
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
18 mai 2004 à 18:53
compilé avec VisualC++ 6.0

l'erreuer n'est pas grave, il suffit de faire un cast lors de l'appel :

ReadFile(g_hCOM, buffer, nBytesToRead, (LPDWORD) pBytesRead, NULL);

DWORD est un entier 32 bits non signé alors que int est un entier 32 bits signés. Les pointeurs sont donc compatibles mais selon les compilos et les niaveaux de warnings et erreurs ça passe pas tout seul.
toninlg Messages postés 1 Date d'inscription mardi 18 mai 2004 Statut Membre Dernière intervention 18 mai 2004
18 mai 2004 à 13:58
Hello YMCA ,

J'ai voulu tester le code que tu as fait mais je n'ai pas su le compiler. J'ai le compilateur Dev-C++ , il m'indique une conversion invalide de int* en DWORD* au niveau des fonctions ReadCOM et WriteCOM.
Tu utilises quel compilateur?

Merci.
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
12 mai 2004 à 13:10
Les commandes AT nécessitent un retour chariot (0x0D, 0x0A) que ce prog n'ajoute pas à la fin des données.

Mon autre prog sur le RS232, plus complet permet cet opération.

Vérifie également le taux de transfert.
greglebreton Messages postés 2 Date d'inscription mardi 11 mai 2004 Statut Membre Dernière intervention 12 mai 2004
12 mai 2004 à 12:16
Hello Ymca,

j ai essaye d utiliser ton application en brachant a mon port serie un telephone mobile.
le but etant d'envoyer des commandes At au modem.
or ca ne fonctionne pas.
En fait les donnees sont bien bufferisee mais pas envoyee au telephone.
par contre lorsque j ouvre Procom (un utilitaire pour commandes AT), les donnees bufferisee sorte alors, comme si elle etait poussee par l ouverture de cette appli vers le mobile.

J attends, ton analyse, tes commentaires.

Merci
Rejoignez-nous