IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Lecture port RS232


Sujet :

MFC

  1. #1
    Membre confirm� Avatar de hamster
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    137
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 137
    Par d�faut Lecture port RS232
    Bonjour, j'ai utilis� le code fourni dans la FAQ VC++ pour �crire un programme qui lit les donn�e sur le port s�rie.

    voici le lien vers la FAQ : http://c.developpez.com/faq/vc/?page...WithSerialPort
    et voici le code que j'ai �crit :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    // Qtrak.cpp : définit le point d'entrée pour l'application console.
    //
     
     
    #include "SerialCom.h"
    #include "stdafx.h"
    #include "Qtrak.h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
     
     
    // Seul et unique objet application
     
    CWinApp theApp;
     
    using namespace std;
     
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    	int nRetCode = 0;
     
    	// Initialise MFC et affiche un message d'erreur en cas d'échec
    	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    	{
    		// TODO : modifiez le code d'erreur selon les besoins
    		_tprintf(_T("Erreur irrécupérable : l'initialisation MFC a échoué\n"));
    		nRetCode = 1;
    	}
    	else
    	{
    		// TODO : codez le comportement de l'application à cet emplacement.
    		cout << "Création de l'objet Com" << endl;
    		CCom com;
    		cout << "Objet créé à l'adresse "<< &com << endl;
    		cout << "Ouverture du port" << endl;
    		com.PortOpen(1,57600,'N',8,0);
    		cout << "Port ouvert" << endl;
    		cout << "Réglage du mode de communication Rts/Cts"<< endl;
    		com.UseXonXoff();
    		cout << "Mode de communication réglé" << endl;
     
    		cout << "Définition de l'événement d'attente" << endl;
    		com.SetCommMask(EV_RXCHAR); // spécifie l'événement d'attente.
    		cout << "Evenement d'attente spécifié" << endl;
    		cout << "Envoi d'une commande au Fastrak" << endl;
    		com.WriteBuffer("C\r\n");
    		cout << "Commande envoyée" << endl;
     
    		DWORD EvtMask;
    		com.WaitCommEvent(EvtMask);// attente réception 
    		char sz[50];
    		com.ReadBuffer(sz,sizeof(sz));
     
    		for (int i = 0; i<50; i++)
    		{
                cout << "SZ :: " << sz[i] << endl;
    		}
    		AfxMessageBox(CString(sz,com.GetCountRead()));
    	}
     
    	return nRetCode;
    }
    le projet que j'ai cr�� est un projet console avec prise en compte MFC.
    A l'�x�cution de ce projet, la chaine de caract�re renvoy�e est uniquement remplie de I avec un accent ������ et en console, �a donne des caract�res comme �a : ╠╠╠╠╠╠ et lorsque je fais une conversion vers un entier, �a donne -52 ( ce qui correspond � 204 = 256 + (-52), 204 �tant le code ascii pour ╠)

    j'ai essay� les diff�rents modes de communications (XON/XOFF, RTC/CTS, DTR/DSR) mais le r�sultat est toujours le m�me.
    La commande C qui est envoy�e par cette commande
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    com.WriteBuffer("C\r\n");
    permet la r�ception continue des donn�es.

    Voici mes questions :
    • Que pensez vous du code ? (erreurs d'�critures, optimisation, etc.)
    • Comment configurer le port pour assurer une r�ception correcte des donn�es ?

  2. #2
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    salut,
    pour decider de la gestion de flux il faut deja savoir quel type de cable on utilise ...
    apres comment est regl� l'emetteur ?
    vitesse de transmission ,flux etc ..
    au hasard tu n'obtiendra rien de valable.
    une solution a taton : utiliser hyperterminal pour trouver la config.

  3. #3
    Membre confirm� Avatar de hamster
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    137
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 137
    Par d�faut
    je ne travaille pas au hasard !
    la doc du mat�riel explique comment configurer une connexion avec hyperterminal et �a fonctionne � merveille !

    la configuration est la suivante :
    • port number : 1
    • baudrate : 9600
    • parity : none
    • wordlength : 8
    • stop bit : 1


    J'ex�cute donc la commande suivante :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    com.PortOpen(1,9600,'N',8,1);
    J'ai un autre param�tre fourni par la documentation :
    • flow control : none
    mais je ne sais pas comment l'utiliser dasn le programme. Est-ce que �a a qqchose � voir avec les diff�rents modes de communications ??

    le cable est un NULL MODEM

    La documentation d�taille �galement l'ensemble des commandes qu'on peut passer par l'interm�diaire de la ligne
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    com.WriteBuffer("P\r\n");
    P permet la r�ception d'une donn�e discr�te
    C permet la r�ception de donn�es continues (mais n�anmoins affich�es de fa�on dicr�te : ~3/secondes dans hyperterminal)

    En ce qui concerne la connectique, seuls 3 pins sur 9 sont utilis�s :
    1. Rx
    2. Tx
    3. GND

  4. #4
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    Citation Envoy� par hamster
    je ne travaille pas au hasard !
    la doc du mat�riel explique comment configurer une connexion avec hyperterminal et �a fonctionne � merveille !

    la configuration est la suivante :
    • port number : 1
    • baudrate : 9600
    • parity : none
    • wordlength : 8
    • stop bit : 1


    J'ex�cute donc la commande suivante :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    com.PortOpen(1,9600,'N',8,1);
    J'ai un autre param�tre fourni par la documentation :
    • flow control : none
    mais je ne sais pas comment l'utiliser dasn le programme. Est-ce que �a a qqchose � voir avec les diff�rents modes de communications ??

    le cable est un NULL MODEM

    La documentation d�taille �galement l'ensemble des commandes qu'on peut passer par l'interm�diaire de la ligne
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    com.WriteBuffer("P\r\n");
    P permet la r�ception d'une donn�e discr�te
    C permet la r�ception de donn�es continues (mais n�anmoins affich�es de fa�on dicr�te : ~3/secondes dans hyperterminal)

    En ce qui concerne la connectique, seuls 3 pins sur 9 sont utilis�s :
    1. Rx
    2. Tx
    3. GND
    oki ,d�sol� ce qui m'a fais dire �a c'est que tu disais avoir essay� differentes combinaisons de flux ,me laissant penser que tu ignorais le parametrage de l'emetteur.
    pourquoi dans ton post precedent tu as ouvert le port a 57600 ?
    c'est une erreur ? ou ? d'apres ton dernier post �a devrait etre 9600 .
    Appel UseRtsCts(false). ce qui devrait invalider la gestion de flux.


  5. #5
    Membre confirm� Avatar de hamster
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    137
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 137
    Par d�faut
    Citation Envoy� par farscape
    pourquoi dans ton post precedent tu as ouvert le port a 57600 ?
    c'est une erreur ? ou ? d'apres ton dernier post �a devrait etre 9600 .
    Appel UseRtsCts(false). ce qui devrait invalider la gestion de flux.

    La plage des taux de transferts va de 2400 � 460800 en passant par 9600 qui est la valeur par d�faut.
    le UseRtsCts(false) ne change rien apparemment...

  6. #6
    Membre confirm� Avatar de hamster
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    137
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 137
    Par d�faut
    j'ai du nouveau !!

    J'ai modifi� le code

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    CCom com;
    		AfxMessageBox(com.GetStringError()); // 1
    		com.PortOpen(1,9600,'N',8,1);
    		AfxMessageBox(com.GetStringError()); // 2
    		com.UseRtsCts(false);
    		AfxMessageBox(com.GetStringError()); // 3
    		com.SetCommMask(EV_RXCHAR); // spécifie l'événement d'attente.
    		AfxMessageBox(com.GetStringError()); // 4
    		com.PurgeCom();
    		AfxMessageBox(com.GetStringError()); // 5
    		com.WriteBuffer("P\r\n");
    		AfxMessageBox(com.GetStringError()); // 6
     
    		DWORD EvtMask = EV_RXCHAR;
    		AfxMessageBox(com.GetStringError()); // 7
    		com.WaitCommEvent(EvtMask);// attente réception 
    		AfxMessageBox(com.GetStringError()); // 8
    		char sz[100];
    		AfxMessageBox(com.GetStringError()); // 9
    		com.ReadBuffer(sz,sizeof(sz));
    		AfxMessageBox(com.GetStringError()); // 10
     
    		for (int i = 0; i<100; i++)
    		{
                cout << "SZ :: " << sz[i] << endl;
    		}
    		AfxMessageBox(com.GetStringError()); // 11
    		AfxMessageBox(CString(sz,com.GetCountRead())); // 12
    		com.Portclose();
    la m�thode AfxMessageBox(com.GetStringError()) permet l'affichage dans une boite de dialogue de la derni�re erreur intercept�e.
    Les 7 premiers engendrent une boite de dialogue vide.
    Les 8, 9, 10 & 11 renvoie une boite de dialogue "Le fichier sp�cifi� est introuvable"
    Quel fichier ??? je ne sais pas...

    enfin le 12 me renvoie les donn�es provenant de mon p�riph�riques (YES !), donn�e par ailleurs affich�es dans la console par la boucle for.

    Ma question (peut etre la derni�re !) : qu'est-ce que cette histoire de fichier sp�cifi� introuvable vient faire ici ???

  7. #7
    Membre confirm�
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par d�faut humm
    Suis pas certain mais de memeoire les ports sont accedes comme des fichiers tu ecris et tu li comme dans un fichier en fait (en c du moins) il y a fort a parier que derriere tous les MFC le mecanisme reste le meme...

    Peut etre faut il tester le bon doureemnt des ouvertures et inits

  8. #8
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    salut,

    le message n'etant que l'interpretation d'un code renvoy� par GetLastError().
    avec la fonction GetError().
    la fonction GetStringError() est � appeler uniquement si la fonction de traitement renvoie false.

  9. #9
    Membre confirm� Avatar de hamster
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    137
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 137
    Par d�faut
    Tr�s bien.
    Je me suis aper�u de quelque chose d'assez bizarre.
    J'ai supprim� les affichages d'erreurs, et le programme ne fonctionnait pas.
    J'ai laiss� suelement l'affichage 8
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    com.WaitCommEvent(EvtMask);// attente réception
          AfxMessageBox(com.GetStringError()); // 8
          char sz[100];
          com.ReadBuffer(sz,sizeof(sz));
    Et l� le code marche !!
    Est-ce qu'il n'y aurait pas la dessous un probleme de temporisation ?

  10. #10
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    ou de gestion de flux ...
    ton systeme sous entend que tu sais combien de caracteres tu dois recevoir .
    ce qui n'est pas le cas dans le cas du fonctionnement par thread ..

Discussions similaires

  1. lecture port serie rs232 vba
    Par amineham87 dans le forum Excel
    R�ponses: 6
    Dernier message: 29/05/2015, 19h47
  2. Lecture trame port rs232
    Par riderfun dans le forum D�buter avec Java
    R�ponses: 0
    Dernier message: 07/06/2010, 12h38
  3. [WD14] lecture sur port Rs232
    Par NICO7285 dans le forum WinDev
    R�ponses: 9
    Dernier message: 12/08/2009, 22h49
  4. Lecture Port RS232
    Par julinho99 dans le forum D�buter
    R�ponses: 6
    Dernier message: 25/11/2008, 14h49
  5. lecture/ecriture des broches RTS/CTS du port RS232
    Par .:: sly51 ::. dans le forum C
    R�ponses: 3
    Dernier message: 24/10/2006, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo