COMMUNICATION PORT SÉRIE RS232

cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008 - 25 mars 2005 à 10:27
devinfos Messages postés 1 Date d'inscription lundi 13 décembre 2010 Statut Membre Dernière intervention 24 mars 2011 - 24 mars 2011 à 17:10
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/30300-communication-port-serie-rs232

devinfos Messages postés 1 Date d'inscription lundi 13 décembre 2010 Statut Membre Dernière intervention 24 mars 2011
24 mars 2011 à 17:10
Merci beaucoup,j'ai essayé le code il marche à merveille
cs_Pico12 Messages postés 1 Date d'inscription jeudi 2 décembre 2004 Statut Membre Dernière intervention 12 février 2008
12 févr. 2008 à 12:38
Excellent code.

Juste 2 petites remarques :
Comme DOPEMAX l'a déjà dit, il manque des accolades dans console.cpp

Pour ceux qui voudrais utiliser des ports supérieur à 10 :
char szCOM[20];
sprintf(szCOM, "\\\\.\\COM%d", nId);
//(cf. MSDN)
C'est utile par exemple pour dialoguer avec un composant USB qui est émulé comme un port serie (microcontroleur, ...).
muuller Messages postés 3 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 22 juin 2007
22 juin 2007 à 18:43
Au fait ce que je voudrai faire c'est piloter une grille de commutation à 4 entrées et 4 sorties à partir du port RS232 d'un pc.
J'aimerai envoyer 4 bytes qui sont respectivement : l'instruction, l'entrée choisie, la sortie choisie,et le n° de machine.Et je voudrai voir le résultat sur l'afficheur 7 segment de ma grille.

Si quelqu'un peut m'aider, je lui en serait trés reconnaissant.
Merci!!!!
muuller Messages postés 3 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 22 juin 2007
22 juin 2007 à 18:39
salut,j'ai utilisé ton code il est vraiment top,mais j'ai 4 erreurs qui sont :
fatal error C1083: Cannot open include file: 'LiaisonRS232.h': No such file or directory
fatal error C1083: Cannot open include file: 'LiaisonRS232.h': No such file or directory
fatal error C1083: Cannot open include file: 'LiaisonRS232.h': No such file or directory
fatal error C1083: Cannot open include file: 'Application.h': No such file or directory
La primère est localisée dans Application.cpp ,la deuxième est dans Console.cpp, la troisième se trouve dans Liaison RS232.cpp et la 4éme est dans source.cpp

pouvez vous m'aider please
cs_Mr.X Messages postés 118 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 2 novembre 2007
17 juin 2007 à 03:06
Les convention aurait du être un peu mieu respecter ... Et puis les variables globale sont a proscrire.
dopemax Messages postés 1 Date d'inscription mardi 29 août 2006 Statut Membre Dernière intervention 30 août 2006
30 août 2006 à 12:03
Bravo pour le code
Une petite remarque, tu as oublié les {} du else dans la fonction void Console::MnuOuvrirCOM() du console.cpp
du coup il indique tout le temps l'erreur, alors qu'il n'y en a pas.
Voila
ben_34_ Messages postés 3 Date d'inscription mardi 28 février 2006 Statut Membre Dernière intervention 9 juin 2006
30 mars 2006 à 15:55
Salut,

D'abord félicitations pour ce code qui est très clair et qui fonctionne bien.

Cependant j'ai un petit problème:
Je souhaite m'en servir pour recevoir et envoyer des données, mais je suis limité dans les données: par exemple si j'envoi "00" en hexa, ça ne marche pas, pareil pour "20" (un espace en ASCII). C'est sûrement parceque certains caractères sont interprétés comme des fins de transmission ou je ne sais quoi, sans doute une fonctionnalité du contrôle de flux.
Je pense qu'en modifiant un paramètre dans com.h je doit pouvoir résoudre mon problème.

Aurais-tu une idée sur le paramètre à changer? Ou est-ce que ce n'est pas si simple?

En te remerciant
saoufe972 Messages postés 1 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 24 mars 2006
24 mars 2006 à 12:26
salut ton programme il est trop top
j'ai un projet en cours.

ce que j'aurais voulu c'est juste le module de lecture de la liaison.
merci
KaYaStar Messages postés 4 Date d'inscription dimanche 12 juin 2005 Statut Membre Dernière intervention 11 juin 2006
9 mars 2006 à 13:07
Vous n'auriez pas la meme chose sous linux ???
berenger_R Messages postés 21 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 3 avril 2006
22 févr. 2006 à 17:56
Bonjour,
Il est dit que ce programme peut receptionner des trames GPS.
Est ce que quelqu'un pourrait m'explique comme il fonctionne. Parce que c'est exactement ce que je doit faire mais, je ne suis pas un spécialiste du C++.
Pour résumer, il me faut récupérer en temps réel les differentes trames GPS qui proviennent d'un recepteur pour les traiter et ranger toutes les données utiles (contenu dans ces trames) dans une structure. Ceci me permetra ensuite de faire des calculs avec ces données.
De plus si quelqu'un sait aussi comment passer des trames récupérées à un type struct.
Je vous remercie par avance
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
15 mai 2005 à 00:44
Ah ça, les MFC, connaissais pas moi ^^.
Pendary Messages postés 7 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 14 mai 2005
14 mai 2005 à 21:58
Merci bien pour ta réponse :)
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
10 mai 2005 à 08:45
il manque #include "StdAfx.h" au début du .cpp

cette include DOIT être le PREMIER de tous les fichiers sources sous VC++ a moins de choisir un projet VIDE.
Pendary Messages postés 7 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 14 mai 2005
7 mai 2005 à 14:15
merci bcp :) a demain ^^
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
7 mai 2005 à 14:12
malheureusement, tu me remercies un tantnet trop vite, parce que je vois pas ... enfin, c'est pas ce que je pensais du moins. manque de bol, je dois partir maintenant, mais si demain matin c'est tjs pas réglé ton souci, envois moi un mail avec ton code, et je regarde quand je suis debout (tard ;)):

kirua at coder-studio . com
Pendary Messages postés 7 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 14 mai 2005
7 mai 2005 à 14:10
en tout cas je te remercie poue ta rapidité et pour ton aide :)
Pendary Messages postés 7 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 14 mai 2005
7 mai 2005 à 14:09
voila :)


#ifndef _LIAISONRS232__H_
#define _LIAISONRS232__H_
#include <windows.h>

class LiaisonRS232
{
public:
LiaisonRS232();
~LiaisonRS232();
bool OpenCOM(int nId);
bool ReadCOM(void* buffer, int nBytesToRead, int* pBytesRead);
bool WriteCOM(void* buffer, int nBytesToWrite, int* pBytesWritten);
bool CloseCOM();
private:
HANDLE g_hCOM;
COMMTIMEOUTS g_cto;
DCB g_dcb;
};
#endif
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
7 mai 2005 à 14:07
non, tu ne m'as pas compris, je pense qu'il y a une erreur dans le .h du controlleur rs232. tu peux le taper ici?
Pendary Messages postés 7 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 14 mai 2005
7 mai 2005 à 14:05
et bien en faite l'erreur provient du fichier LiaisonRS232.cpp donc c'est pas mon programme en faite ;)

Le problème vient donc du ficheir que je vien de dl

Pourrais tu me dire si tu vois une faute dans le programme stp ? :)

Merci d'avance

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include
#include <string.h>
#include "LiaisonRS232.h"

using namespace std;

#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) */
int nId;
int nBytesWritten;
int nBytesRead;

LiaisonRS232::LiaisonRS232()
{
//configuration du temps d'attente
g_cto.ReadIntervalTimeout = MAX_WAIT_READ;
g_cto.ReadTotalTimeoutMultiplier = 0;
g_cto.ReadTotalTimeoutConstant = MAX_WAIT_READ;
g_cto.WriteTotalTimeoutMultiplier = 0;
g_cto.WriteTotalTimeoutConstant = 0;

//Configuration du Port
g_dcb.DCBlength = sizeof(DCB);
g_dcb.BaudRate = 9600;
g_dcb.fBinary = true;
g_dcb.fParity = false;
g_dcb.fOutxCtsFlow = false;
g_dcb.fOutxDsrFlow = false;
g_dcb.fDtrControl = DTR_CONTROL_ENABLE;
g_dcb.fDsrSensitivity = false;
g_dcb.fTXContinueOnXoff = false;
g_dcb.fOutX = false;
g_dcb.fInX = false;
g_dcb.fErrorChar = false;
g_dcb.fNull = false;
g_dcb.fRtsControl = RTS_CONTROL_ENABLE;
g_dcb.fAbortOnError = false;
g_dcb.fDummy2 = 0;
g_dcb.wReserved = 0;
g_dcb.XonLim = 0x100;
g_dcb.XoffLim = 0x100;
g_dcb.ByteSize = 8;
g_dcb.Parity = NOPARITY;
g_dcb.StopBits = ONESTOPBIT;
g_dcb.XonChar = 0x11;
g_dcb.XoffChar = 0x13;
g_dcb.ErrorChar = '?';
g_dcb.EofChar = 0x1A;
g_dcb.EvtChar = 0x10;
}

LiaisonRS232::~LiaisonRS232()
{
}

bool LiaisonRS232::OpenCOM(int nId)
{
char szCOM[5];

/* 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;
}

bool LiaisonRS232::ReadCOM(void* buffer, int nBytesToRead, int* pBytesRead)
{
return ReadFile(g_hCOM, buffer, nBytesToRead, (LPDWORD)pBytesRead, NULL);
}

bool LiaisonRS232::WriteCOM(void* buffer, int nBytesToWrite, int* pBytesWritten)
{
return WriteFile(g_hCOM, buffer, nBytesToWrite, (LPDWORD)pBytesWritten, NULL);
}

bool LiaisonRS232::CloseCOM()
{
CloseHandle(g_hCOM);
return true;
}
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
7 mai 2005 à 13:58
tu n'aurais pas oublié un #endif ou un ; après une déclaration de class / struct / enum ?
Pendary Messages postés 7 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 14 mai 2005
7 mai 2005 à 13:53
Salut je viens de décourvir ton code , et je ten remercie c'est ce que je cherchais :)

je viens de m'en servir mais j'obitent une erreur : voici le bout de programme que j'ai tapé

void CMesurePlaneiteDlg::OnConfiguration()
{
LiaisonRS232 *Liaison = new LiaisonRS232();
int init = Liaison->OpenCOM(1);
if (init) m_sTrame="initialisation ok!";
UpdateData(FALSE);

char *Trame;
int *nb_envoi;
sprintf(Trame, "%s%s%s%s", 0x50, 0x4C, 0x2C, 0x31);

Liaison->WriteCOM(Trame,strlen(Trame),nb_envoi);
Liaison->CloseCOM();
}

et j'obtient ceci comme erreur lors de la compilation, si tu pouvais m'aider :) ca serai sympa :)

"fatal error C1010: unexpected end of file while looking for precompiled header directive"
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
25 mars 2005 à 10:27
Tu devrais, je pense, appeler CloseCOM() dans le destructeur de la classe de liaison rs232.

Aussi, tu mélanges l'ensemble windows.h BOOL TRUE FALSE et l'ensemble standard (intégré au langage) bool true false. Fais ton choix :)

Sinon, merci pour ce code. Faudrait que je me mette à l'électronique un de ces jours.
Rejoignez-nous