CLASSE DE CONTRÔLE DU PORT SÉRIE RS232 AVEC LES API WINDOWS.

MangaII Messages postés 129 Date d'inscription dimanche 9 décembre 2001 Statut Membre Dernière intervention 12 janvier 2009 - 15 mai 2003 à 10:02
 Ouinten - 19 févr. 2016 à 02:42
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/10747-classe-de-controle-du-port-serie-rs232-avec-les-api-windows

Merci, ça m'a servi très bien.
chocho80 Messages postés 2 Date d'inscription jeudi 4 novembre 2010 Statut Membre Dernière intervention 5 janvier 2013
5 janv. 2013 à 13:00
désolé je n'avais pas vu le lien pour les fichiers merci
http://mixandtec.free.fr/articles/artnorm1_1.php
chocho80 Messages postés 2 Date d'inscription jeudi 4 novembre 2010 Statut Membre Dernière intervention 5 janvier 2013
5 janv. 2013 à 12:40
bonjour,

Les fichiers sources LSerie.cpp et LSerie.h ne sont pas disponibles ainsi que le programme SerialTest.exe, pouvez vous les ajouter merci
lilight Messages postés 11 Date d'inscription lundi 9 avril 2012 Statut Membre Dernière intervention 28 avril 2012 1
28 avril 2012 à 10:09
Pour ce qui est de la communication via les ports series j'ai trouve la solution :
http://www.siteduzero.com/forum-83-758743-p1-communication-port-serie.html#r7303079
guylaroz Messages postés 4 Date d'inscription lundi 3 janvier 2011 Statut Membre Dernière intervention 9 mars 2012
27 avril 2012 à 19:40
bonjour liligth, mon projet consiste à élaborer un programme permettant de communiquer avec les controleurs de carrefour à feux tricolores qui utilisent les protocole DIASER. cette communication est faite par liasion serie rs232 ou ethernet. Apres communication, pouvoir élaborer un systéme de telegestion afin de pouvoir receuillir le journal de bord du controleur (defaut,alarmes,...).
Sa me fera un plaisir si quelqu'un peut m'aider car j'ai 3 mois de stage or j'ai deja fais 2 mois sans avancement.
Cordialement!
lilight Messages postés 11 Date d'inscription lundi 9 avril 2012 Statut Membre Dernière intervention 28 avril 2012 1
21 avril 2012 à 08:52
Bonjour Guylaroz, pourrait expliquer en détail ce que tu cherches a faire, ainsi que ton problème, il est possible que nous ayons le même
lilight Messages postés 11 Date d'inscription lundi 9 avril 2012 Statut Membre Dernière intervention 28 avril 2012 1
21 avril 2012 à 08:46
Bonjour Guylaroz, pourrais tu expliquer ce que tu cherches a faire ainsi que ton problème, il est possible que nous ayons le meme problème...
guylaroz Messages postés 4 Date d'inscription lundi 3 janvier 2011 Statut Membre Dernière intervention 9 mars 2012
11 mars 2012 à 15:13
bonjour, j'ai tester ton programme. je le trouve parfait mais j'ai un petit soucis et j'aimerais avoir votre aide. je suis sur un projet de fin d'étude et je voudrais adapté cette communication aux contrôleur de carrefour à feux (TRAFFY ou celui de SAGEM) qui utilise le protocole DIASER. aussi permettre de transmettre à distance ces information recueillies sur le contrôleur par GSM, RADIO ou RTC.
Pouvez vous m'aidez car j'en ai besoin pour ma soutenance.
merci et cordialement!
guylaroz Messages postés 4 Date d'inscription lundi 3 janvier 2011 Statut Membre Dernière intervention 9 mars 2012
9 mars 2012 à 21:21
bonjour, j'ai tester ton programme. je le trouve parfait mais j'ai un petit soucis et j'aimerais avoir votre aide. je suis sur un projet de fin d'étude et je voudrais adapté cette communication aux contrôleur de carrefour à feux (TRAFFY ou celui de SAGEM) qui utilise le protocole DIASER. aussi permettre de transmettre à distance ces information recueillies sur le contrôleur par GSM, RADIO ou RTC.
Pouvez vous m'aidez car j'en ai besoin pour ma soutenance.
merci et cordialement!
cs_amira2012 Messages postés 1 Date d'inscription vendredi 25 novembre 2011 Statut Membre Dernière intervention 30 décembre 2011
30 déc. 2011 à 10:02
slt bon travail
krustymars Messages postés 2 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 17 mai 2010
17 mai 2010 à 23:23
include windows.h
samoura969 Messages postés 7 Date d'inscription lundi 17 mai 2010 Statut Membre Dernière intervention 15 juin 2010
17 mai 2010 à 20:16
Bonjour, je m'en sert avec Qt et sur windows7, pourquoi ai-je DWORD, LPBYTE et bien d'autrs non déclarés?
Merci
cs_kingkouka Messages postés 4 Date d'inscription jeudi 26 janvier 2006 Statut Membre Dernière intervention 4 mai 2010
3 mai 2010 à 14:23
voici mon petit code, mais il ne compile pas. Je l'ai ajouté à la fin du contenu de LSerie.cpp
Quelqu'un peut-il m'aider???? Vite.........

int void main(int argc, char *argv[]){
com = new LSerie();
// Tentative d'ouverture du port COM2 à une vitesse de 9600 bauds (8bit, 1bit de stop et pas de parité).
if( !com->open(2, 9600) )
{
MessageBox("Port Com indisponible", "SerialTest : Erreur!");
return;
}
// Envois d'une chaine de caractères:
std::string stdString("Message à transmettre");
if( com->sendData(&stdString) < 0 )
{
MessageBox("Envois de données imposssible", "SerialTest : Erreur!");
return;
}

system("pause");
}
cs_kingkouka Messages postés 4 Date d'inscription jeudi 26 janvier 2006 Statut Membre Dernière intervention 4 mai 2010
3 mai 2010 à 13:53
je suis débutant en C++

comment faire un simple programme d'envoi et de reception sur le port série....

je veux le programme main principale....est ce je dois inclure "LSerie.h" et "LSerie.cpp" ???

comment faire la liaison de mon programme principale avec LSerie.h et LSerie.cpp

merci
krustymars Messages postés 2 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 17 mai 2010
24 mars 2010 à 19:54
salut
meme plusieurs années apres la publication de ta classe, merci car elle me rend bien service
cs_budo Messages postés 5 Date d'inscription mercredi 3 mars 2004 Statut Membre Dernière intervention 7 juillet 2015
4 nov. 2009 à 23:48
bonjour ,
je travaille avec GNU C++ codeblock

je n'ai pas stadfx etc..

puis je m'en passer ou est ce obligatoire

merci
dorralya Messages postés 1 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 30 octobre 2009
30 oct. 2009 à 17:04
Bonjour
j'ai téléchargé les sources, mais j'ai des pbs.
J'ai une dalle tactile reliée à un adaptateur série-usb, mon PC la voit reliée au port COM2.
Qd j'essaye d'envoyer des commandes avec hyperterminal, ça marche tres bien, je reçois les reponses, et j'ai pu voir les échanges avec portmon.
Sauf qu'avec l'API Lserie,si j'envoie une commande (exemple "V"), je ne reçois rien.
je vois la commande qui est envoyée avec succès avec portmon, et tous les read qui suivent sont "timeoutés".
Quelqun a t-il une idée sur la cause du pb?
Merci beaucou
Gesane Messages postés 1 Date d'inscription samedi 28 mars 2009 Statut Membre Dernière intervention 28 mars 2009
28 mars 2009 à 23:38
Bonjour

Je cherchais justement un code qui fait me permet de communiquer avec le port serie via un programme de visual C++.

J ai donc telecharger le tien mais j'ai un message d'erreur qui dit:
"fatal error C1083: Cannot open include file: 'afxwin.h': No such file or directory"

Pourrais-tu me conseiller STP

Merci
wasaikos Messages postés 19 Date d'inscription samedi 3 novembre 2007 Statut Membre Dernière intervention 24 juin 2008
17 juin 2008 à 16:33
C'est bon merci je suis passé sous visual ça marche maintenant c'été une histoire de librairie.
PS: j'avé testé sous hyperterminal avant le cable été bon et le caractere aussi!!
encore merci a la prochaine.
djlex03 Messages postés 12 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 16 juin 2008
16 juin 2008 à 18:42
Les caractères envoyés le sont bien en ASCII (normalement).
As-tu essayé d'envoyer les caractères avec le programme hyperterminal de Windows ?

Utilise-tu un câble série fourni par le fabricant du matériel ? dans le cas contraire tu as peut être besoin d'un câble croisé type nullmodem.
Pour les caractères, as-tu essayé en minuscules et majuscule ?
wasaikos Messages postés 19 Date d'inscription samedi 3 novembre 2007 Statut Membre Dernière intervention 24 juin 2008
16 juin 2008 à 11:08
ça marche toujours pas j'ai pourtant fait ce que tu mas dit; je demande quelque chose es que le caractère envoyé par la fonction est un ascii car moi il faut que s'en soit un!
Es que le fait que je soit sur un support autre que Visual c++ pourrait me bloquer
wasaikos Messages postés 19 Date d'inscription samedi 3 novembre 2007 Statut Membre Dernière intervention 24 juin 2008
15 juin 2008 à 14:54
Je developpe avec codeblock 8.02, je me demande si il peut y avoir des problèmes de librairie a cause de ça!
mais parametres sont
vitesse: 9600 bits
arrêt: 1 bits
controle de flux: aucun
donnée: 8 bits
Si tu as des idées a me proposer n'hésite pas!
je te tien au courant lundi si ca marche ou pas!!
djlex03 Messages postés 12 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 16 juin 2008
13 juin 2008 à 18:52
Quel est ta plateforme de développement ?
Quels paramètres de liaison série as-tu utilisé ?

Il faut peut être envoyer un retour charriot en fin de chaine, essaye d'envoyer les chaines suivantes : "T1\r\n" ou "T1\n" ou "T1\r".
wasaikos Messages postés 19 Date d'inscription samedi 3 novembre 2007 Statut Membre Dernière intervention 24 juin 2008
13 juin 2008 à 08:51
voici ma fonction :

int test_com_envoie()
{
LSerie *ls;

std::string stdString("T1");

return ls->sendData(&stdString);

}

il ce pose un problème, il ne ce passe pas ce qu'il devrait passer ^^) en effet le caractère "T1" permet de mettre a zero l'indicateur, tant que je n'ai pas réussi à le faire je sais donc que cela n'a pas fonctionné !!
D'où peut venir mon problème
-l'indicateur ne comprend pas les cstring?
-mon compilateur ne fait pas ce qu'il faut (pb de librairie?)
PS: dans LSerie.cpp cette ligne (#include <stdafx.h>) me génère une foule d'erreurs je l'ai
donc mise en commentaire es que l'erreur peut venir de là et comment là regler !?!
merci d'avance !!
wasaikos Messages postés 19 Date d'inscription samedi 3 novembre 2007 Statut Membre Dernière intervention 24 juin 2008
12 juin 2008 à 22:05
merci de ton aide très rapide !!
je te tiendrais au courant si le test c'est bien passé ou pas
a plus.
djlex03 Messages postés 12 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 16 juin 2008
12 juin 2008 à 20:08
Exemple d'utilisation:

std::string stdString("P1");
if( com->sendData(&stdString) < 0 )
{
MessageBox("Envois de données imposssible", "SerialTest : Erreur!");
return;
}
djlex03 Messages postés 12 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 16 juin 2008
12 juin 2008 à 20:03
Cette classe utilise les API native de Windows, elle fonctionne donc avec les versions 9x de Windows et avec les versions NT4, 2000, XP.

djlex03
wasaikos Messages postés 19 Date d'inscription samedi 3 novembre 2007 Statut Membre Dernière intervention 24 juin 2008
12 juin 2008 à 10:44
bonjour a tous merci pour ce source
j'aurais un service a vous demander, je suis en trin d'établir la connections avec mon indicateur "MAGIC" de chez MasterK, je suis arrivé a ouvrir le port et a le configurer, mais mon problème ce situe dans l'envoie (sendData) et donc par la même occasion sur la réception (receiveData)il faut que j'envoie a mon indicateur "P1" pour par exemple pour qu'il me retourne le poids, je ne sais pas ce que je doit envoyer comme type de paramètre pour la fonction [int sendData(string* data)].
si vous pourriez me dire comment créer un paramètre de type (string* data) ce que je dois inclure et comment lui donner la valeur "P1" ça me serais bien utile.
Merci d'avance.
mikeau Messages postés 1 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 19 novembre 2007
19 nov. 2007 à 15:25
Très pratique et bein structuré !
cs_MoSin Messages postés 1 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 14 septembre 2007
14 sept. 2007 à 21:37
Salut, j'ai besoin d'une classe qui gère la communication série et ta solution semble être parfaite. La seule question que j'ai c'est qu'il faut que je puisse être capable de mettre la vitesse a 1mbit ( 1 000 000 ). Est-ce que ta classe supporte cela? Et même sais tu si ça dépend du driver série. Moi ça va passe dans un virtual com port, ensuite usb et ensuite à un robot.

Merci!
Famidoo Messages postés 13 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 17 juillet 2006
23 juil. 2006 à 01:24
J'ai un périphérique connecté à mon pocket pc via port série, j'aimerai tester ca fonctionne aussi ?
djlex03 Messages postés 12 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 16 juin 2008
30 mai 2006 à 19:47
Pour cela il faut utiliser au choix les fonctions :
- receiveData(DWORD lg, LPBYTE data):
char tab[100];
receiveData(tab, 100)

- receiveData(string* data)
std::string chaine = new string();
receiveData(chaine);
char* tab = chaine.c_str()

Je n'ai pas de compilateur C++ d'installé sur mon pc (ca fait longtemp que je ne programme plus en C++), je ne peut donc pas tester ce code. Je le donne juste à titre indicatif.
cs_torfin Messages postés 28 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 28 août 2006
30 mai 2006 à 19:32
on pourrait avoir un exemple pour recevoir une chaine de caractere et la stocker dans un char[]?
djlex03 Messages postés 12 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 16 juin 2008
30 mai 2006 à 19:29
Il n'est pas possible de connaître l'état logique de la ligne RX à un instant t (c'est la seule ligne qui n'est pas accessible directement).
On peut éventuellement arriver à reconnaitre certaines PWM en paramétrant le port de manière astucieuse, mais c'est tout.
Pour avoir des entrées sorties binaires directes il vaut mieux utiliser le port parallèle ou une interface de conversion série - parallèle.
cs_torfin Messages postés 28 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 28 août 2006
22 mai 2006 à 20:41
DJLEX03 je voulais dire juste avoir si c un NL1 ou un NL0 (NL: niveau logique)
djlex03 Messages postés 12 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 16 juin 2008
22 mai 2006 à 18:51
La ligne RX n'est pas contôlable directement. Le flux de données passe directement dans l'UART qui le décode.
cs_torfin Messages postés 28 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 28 août 2006
22 mai 2006 à 15:54
Pour le problème de RI, sa vient de mon adaptateur USB -> rs232!
Donc pas de souci, la classe fonctione nikel chrome.

La question sur RX reste entière!
cs_torfin Messages postés 28 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 28 août 2006
21 mai 2006 à 16:36
Ce n'est plus la peine de traduire ce code en C car je me suis mis au c++ qui me eprmet de faire des trucs vraiment bien.

J'ai tout de même un enorme problème avec cette classe:
Lorsque je met via la ligne tx un niveau 1 et que TX est relié à RI, lorsque je lit RI j'ai une valeur qui fait 0 puis 1 puis 0 tout le temps, avec des lecture succésive sans toucher a la ligne TX.
Sinon est il possible de controller la ligne RX comme les lignes DSR et autres?
cs_torfin Messages postés 28 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 28 août 2006
10 mai 2006 à 21:25
est-ce que une ame charitable pourrait transcrire ce code de C++ en C, car je ne c'est pas écrire en C++.
cs_glaurung Messages postés 1 Date d'inscription mardi 7 février 2006 Statut Membre Dernière intervention 13 mars 2006
13 mars 2006 à 10:14
Bonjour,
Je crois qu'il y a une petite erreur dans la fonction membre open(...)

//Vérification de la parité: 0 pas de vérif, 1 pair, 2 impaire.
if(nbStopBit == 0)
dcb.Parity = NOPARITY;
etc...

"nbStopBit" devrait en fait être "parity". Mais même en changeant ça, j'ai le comportement étrange suivant.
J'utilise le bout de code suivant :

#define COM 1
#define BAUD 19200
Lserie * com=new LSerie();
string szDia="DIA\r";
if( !com->open(COM, BAUD) )
Message d'erreur 1
if( com->sendData(&szDia) < 0 )
Message d'erreur 2
if (com->receiveData(&szBuffer)<=0)
Message d'erreur 3

Il s'agit d'envoyer à un appareil connecté au port série la commande "DIA" terminée par un retour de chariot, et l'appareil répond. Si je lance le programme, j'obtiens le troisième message d'erreur, et en effet szBuffer est vide et ne contient pas la réponse de l'appareil.
Par contre, si avant de lancer le programme, je me connecte à l'appareil avec hyperterminal et que j'envoie la commande "DIA\r", je reçoit bien une réponse de l'appareil. Ensuite, si je ferme hyperterminal, mon programme fonctionne sans problème. Il faut donc systématiquement que je me connecte d'abord avec hyperterminal avant de pouvoir utiliser mon programme en C++, ce qui est assez ennuyeux. Auriez-vous une idée sur l'origine du problème?

Merci
djlex03 Messages postés 12 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 16 juin 2008
22 mai 2005 à 13:59
>>> martinbrochet
>>>bonjour j'ai une demande un peu particulière, j'utilise des capteurs branché sur port serie Com >>>1 et 4. ils sont géré par thread . ca marchait super bien sur CE mais je suis passé sur >>>embedded XP et maintenant la com arrive à me planter de chez planter mes capteurs c'est à dire >>>que mon capteur ne dialogue plus dutout . j'ai bien sur fait attention au : aprè la definition >>>des com (càd com1: -> com1) savez vous si il y une différence fondamentalle sur la gestion de >>>com ?

Bonjour, je n'ai pas travaillé sur le système embedded XP, je ne pourrais donc pas vous renseigner. Cependant, je pense qu'il serait interessant de voir si le problème persiste en ne faisant tourner qu'un seul thread.
djlex03 Messages postés 12 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 16 juin 2008
22 mai 2005 à 13:49
>>>Pendary
>>>slt, je viens de dl les fichier L_SERIE.h et L_SERIE.cpp
>>>et j'ai un peu de mal a utiliser la fonction SendData
>>>Je dois envoyer la trame qui suit "PL,1 et le retour chariot(0x0D)"
>>>si quelqun pourrait m'aider.

Bonjour, Avec la nouvelle version de la librairie lserie (lSerie.h et lSerie.cpp), tu devrais pouvoir le faire avec ce code:
com = new LSerie();
if( !com->open(1, 9600) )
{
MessageBox("Port Com indisponible", "SerialTest : Erreur!");
return;
}
std::string stdString("PL,1\n");
if( com->sendData(&stdString) < 0 )
{
MessageBox("Envois de données imposssible", "SerialTest : Erreur!");
return;
}
martinbrochet Messages postés 33 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 25 mai 2005
10 mai 2005 à 14:01
bonjour j'ai une demande un peu particulière, j'utilise des capteurs branché sur port serie Com 1 et 4. ils sont géré par thread . ca marchait super bien sur CE mais je suis passé sur embedded XP et maintenant la com arrive à me planter de chez planter mes capteurs c'est à dire que mon capteur ne dialogue plus dutout . j'ai bien sur fait attention au : aprè la definition des com (càd com1: -> com1) savez vous si il y une différence fondamentalle sur la gestion de com ? parce que ca me faite vraiment chier
merci @ ++
Pendary Messages postés 7 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 14 mai 2005
6 mai 2005 à 20:39
slt, je viens de dl les fichier L_SERIE.h et L_SERIE.cpp

et j'ai un peu de mal a utiliser la fonction SendData

Je dois envoyer la trame qui suit "PL,1 et le retour chariot(0x0D)"

si quelqun pourrait m'aider.

Merci d'avance ;)
CYouness Messages postés 5 Date d'inscription dimanche 17 octobre 2004 Statut Membre Dernière intervention 17 octobre 2004
17 oct. 2004 à 13:20
ca marche bien ton code merci.......pour des projets en commun contactez moi......je suis nouveau sur le site.mais on peut toujours s'entendre...à créer une application ou un jeu.........je vous attends
olischlo Messages postés 3 Date d'inscription jeudi 24 juin 2004 Statut Membre Dernière intervention 6 octobre 2004
2 juil. 2004 à 14:42
Ca marche très bien !
Merci bien !
djlex03 Messages postés 12 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 16 juin 2008
15 mai 2003 à 11:26
Le programme fonctionne sur les systémes Win9x et Win NT (2000, XP...), car il utilise l'API de windows pour accéder au port série.
MangaII Messages postés 129 Date d'inscription dimanche 9 décembre 2001 Statut Membre Dernière intervention 12 janvier 2009
15 mai 2003 à 10:02
Salu !
Ton système fonctionne sur tous les système ? win 9x ? NT ? 2000 ? XP ?
Rejoignez-nous