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

C++ Discussion :

Port série en C++ : Gestion des CTS/RTS


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 25
    Par défaut Port série en C++ : Gestion des CTS/RTS
    Bonjour à tous,

    Je ressors un vieux dossier qui me hante...
    Pour explication je refais un driver (ancien en basic donc je n'ai pas le code source, nouveau en c++) de communication avec du matériel avec lequel on communique de deux manières différentes mais le tout sur port série (SUBD9)

    Pour le 1er protocole, tout va bien et ça marche du feu de Dieu : Communication asynchrone sur un simple rx/tx/masse... donc le driver marche mieux que l'ancien en terme de temps de réponse etc... surement une illusion.

    Pour le second, ça se corse (enfin pour moi) : il s'appuie sur le contrôle CTS/RTS.
    Après avoir bataillé sur les différentes options de mon "m_dcb.fRtsControl" en mode : ENABLE/HANDSHAKE/DISABLE... j'ai craqué et j'ai visualisé mes trames à l'oscillo numérique...
    J'ai constaté un décalage de 3ms à 38400baud/s...
    Résultat : j'ai fait le bourrin et j'ai désactivé toute forme de CTS/RTS géré, j'ai juste vérifié le RTS lors de la réception et j'ai mis un vieux "Sleep" dégueulasse au début de ma réception.

    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
    ///////////////////////////////////////////////////////////////////////////////
    // Get data from the connection
    int CSerialPort::ReceiveData(DWORD lg, LPBYTE data)
    {
    	DWORD read   = 0;
    	DWORD result = 0;
    	double timer = 0;
    	LARGE_INTEGER frequency, timeBefore, timeAfter;
    	QueryPerformanceFrequency(&frequency);
    	QueryPerformanceCounter(&timeBefore);
     
    	while(timer < m_iTimeOut && result < lg)
    	{
    		if(m_bUseRTS) {Sleep(3*38400/m_iBaudRate);}
    		else {Sleep(5*38400/m_iBaudRate);}
     
    		// Reading informations from port
    		if (!ReadFile(m_hCom, &data[result], lg-result, &read, NULL))
    			{return -1;}
    		result += read;
     
    		// Updating timer
    		QueryPerformanceCounter(&timeAfter);
    		timer = 1000.0 * (timeAfter.QuadPart - timeBefore.QuadPart) / frequency.QuadPart;
    	}
     
    	return result;
    }
    ///////////////////////////////////////////////////////////////////////////////
    // send data on the connection
    int CSerialPort::SendData(DWORD lg, LPBYTE data)
    {
    	DWORD result = 0;
    	DWORD total  = 0;
     
    	if(m_bUseRTS) EscapeCommFunction(m_hCom, CLRRTS);
     
    	// Write data to com port
    	if (!WriteFile(m_hCom, data, lg, &result, NULL))
    		{result = -1;}
    	// CTS/RTS period
    	if(m_bUseRTS) {
    		Sleep(3*38400/m_iBaudRate);
    		EscapeCommFunction(m_hCom, SETRTS);
    	}
     
    	return result;
    }
    Ça fonctionne dans l'état, mais j'ai tout de même des pertes de trames non négligeables (voire gênant sur un port série émulé en USB)
    Donc je recherche toujours une soluce propre...
    J'ai mis un '\0' à la fin de mes trames pour essayer mais ça change rien (si je me mets en 'RTS_CONTROL_HANDSHAKE' ou 'RTS_CONTROL_ENABLE')
    J'ai essayé certaines classes de gestion de port série (ca passe pas), j'ai lu plusieurs fois les tutos associés dans la section qui va bien...

    Si vous avez ne serait-ce que des ombres de suggestions je suis prenneur.

    Merci d'avance!

  2. #2
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 25
    Par défaut
    Petit UP

    Je me permets de remonter mon sujet. Si vous avez besoin d'infos supplémentaires, je peux ajouter ce qu'il vous semble utile à la compréhension de mon problème.

    D'avance merci

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Bonjour,

    A priori, ton problème n'a pas l'air lié au C++, mais plus à la communication série en général. Peut-être aurais-tu plus de chances sur un autre forum, mais je ne sais trop lequel conseiller ? hardware ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 25
    Par défaut
    Et bien vu que le driver existant fonctionne (en basic), je me dis que ça ne peut que de mon driver C++ et de la gestion du CTS/RTS (car ça fonctionne avec l'autre protocole qui ne l'utilise pas).

    En ne changeant que le driver de comm', ça ne marche pas aussi bien, d'où mon post ici

Discussions similaires

  1. Gestion du RTS d'un port série
    Par Luc84 dans le forum C++
    Réponses: 1
    Dernier message: 05/02/2009, 14h29
  2. lecture/ecriture des broches RTS/CTS du port RS232
    Par .:: sly51 ::. dans le forum C
    Réponses: 3
    Dernier message: 24/10/2006, 15h28
  3. gestion des port !
    Par seal3 dans le forum Développement
    Réponses: 12
    Dernier message: 01/05/2005, 20h43
  4. Etat de CTS sur port série
    Par Juste_Une_IlluZion dans le forum C++Builder
    Réponses: 9
    Dernier message: 12/09/2004, 10h46
  5. Routines de gestion des ports sous Windows XP
    Par wiccanhelios dans le forum Windows
    Réponses: 2
    Dernier message: 14/11/2003, 08h02

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