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

Langage C++ Discussion :

Problème communication série


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Problème communication série
    Bonjour,

    Je travaille dans une société ou nous utilisons un contrôleur relié à un PC par liaison RS232. Cette liaison est assurée via le port COM ou via le port USB du PC émulé de manière à être utiliser comme un port série.

    Mon problème est le suivant:
    Je travaille sur un projet en C++ utilisant MFC (avec Visual Studio 2005), et je dois communiquer avec le contrôleur via la liaison USB.
    Cette communication en temps normal fonctionne parfaitement.
    Après redémarrage de notre contrôleur, je parviens à ouvrir le port Com mais je m'apercois que ce dernier recoit des trames incohérente.

    Nous utilisons d'habitude Visual Basic .NET et la classe System.IO.Ports.SerialPort avec la méthode open. La seule solution que j'ai trouvé pour rétablir une communication normale entre le contrôleur et le PC (après redémarrage du contrôleur) est donc de lancer une de nos applications VB, d'ouvrir et de fermer le port, puis de relancer mon application en C++.

    Je pense qu'il s'agit d'un problème sur l'ouverture du port, peut être une option manquante mais je n'arrive pas à indentifier le problème. Voici le code que j'utilise pour l'ouverture du port :

    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
     
    bool CPfcsClientDlg::openRS232(int numPort)
    {
     	 BOOL     m_bPortReady;
    	 COMMTIMEOUTS m_CommTimeouts;
    	 DCB      m_dcb;
    	 char port[5];
    	 memset(port,0,5);
    	 sprintf(port,"COM%d",numPort);
     
    	 m_hCom = CreateFile(port, 
    		GENERIC_READ | GENERIC_WRITE,
    		0, // exclusive access
    		NULL, // no security
    		OPEN_EXISTING,
    		1, // no overlapped I/O
    		NULL); // null template 
     
    	 // si l'ouverture a échoué
    	 if(m_hCom == INVALID_HANDLE_VALUE)
    	 {
    		 m_hCom = NULL;
    		 return FALSE; 
    	 }
     
    	 m_dcb.BaudRate = 9600;
    	 m_dcb.ByteSize = 8;
    	 m_dcb.Parity = NOPARITY;
    	 m_dcb.StopBits = ONESTOPBIT;
    	 m_dcb.fAbortOnError = TRUE;
    	 m_bPortReady = SetCommState(m_hCom, &m_dcb);
     
    	 m_CommTimeouts.ReadIntervalTimeout = 50;
    	 m_CommTimeouts.ReadTotalTimeoutConstant = 50;
    	 m_CommTimeouts.ReadTotalTimeoutMultiplier = 50;
    	 m_CommTimeouts.WriteTotalTimeoutConstant = 50;
    	 m_CommTimeouts.WriteTotalTimeoutMultiplier = 10;
    	 m_bPortReady = SetCommTimeouts (m_hCom, &m_CommTimeouts);
     
    	 PurgeComm(m_hCom, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
    	 EscapeCommFunction(m_hCom, SETDTR);
     
    	 return(m_bPortReady);
    }
    Je suis ouvert à toutes propositions pour m'aider à résoudre ce problème.

    Merci d'avance pour vous réponses.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Quand un truc marche en .NET et qu'il faut le faire en natif, moi, je ne vais pas par quatre chemins, je décompile l'assembly avec Refector (http://www.red-gate.com/products/reflector/).

    An regardant avec cet outil, on voit que SerialPort.Open utilise la classe SerialStream.
    Dans son constructeur, on voit que la fonction Win32 CreateFile n'utilise pas la même chaine de caractères mais Donc essayez de singer le constructeur de la classe SerialStream pour avoir un code aussi fiable que la version .NET.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci pour cette réponse et pour ce petit outil qui me sera bien utile à l'avenir je pense.
    Je viens d'essayer de remplacer le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(port,"COM%d", numPort);
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(port,"\\\\.\\COM%d", numPort);
    Le résultat est malheuresement le même. En regardant le constructeur de SerialStream, je ne vois pas bien ce que je pourrai essayer d'autre. Le code semble similaire à celui que j'ai utilisé.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Si le code VB.NET marche, singez sérieusement le constructeur de SerialStream, qui fait tout de même près de 100 lignes.

Discussions similaires

  1. Problème : Communication Série
    Par bouftat dans le forum C
    Réponses: 2
    Dernier message: 13/02/2014, 13h05
  2. Problème communication série Java.
    Par dubser dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 06/04/2010, 02h36
  3. Problème de communication série
    Par djyoyo01 dans le forum MATLAB
    Réponses: 2
    Dernier message: 14/12/2007, 10h21
  4. Problèmes avec la communication série
    Par rzayani dans le forum Windows
    Réponses: 3
    Dernier message: 18/06/2007, 11h57
  5. [communication série] problème lecture/écriture
    Par davinout dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 01/06/2005, 13h14

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