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 régulier Avatar de hamster
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 137
    Points : 123
    Points
    123
    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
    Points : 17 323
    Points
    17 323
    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 régulier Avatar de hamster
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 137
    Points : 123
    Points
    123
    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
    Points : 17 323
    Points
    17 323
    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 régulier Avatar de hamster
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 137
    Points : 123
    Points
    123
    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 régulier Avatar de hamster
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 137
    Points : 123
    Points
    123
    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 régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Points : 102
    Points
    102
    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
    Points : 17 323
    Points
    17 323
    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 régulier Avatar de hamster
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 137
    Points : 123
    Points
    123
    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
    Points : 17 323
    Points
    17 323
    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