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

Windows Discussion :

Problèmes avec la communication série


Sujet :

Windows

  1. #1
    Nouveau membre du Club Avatar de rzayani
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut Problèmes avec la communication série
    Bonjour,

    J'ai deux problèmes avec la communication série.
    1- Les caractéristiques de mon liaison sont : 38400 bauds, 1 bit de parité, 1 start bit et 8 data bits.

    Le code suivant permet d'initialiser la liaison:
    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
    64
    65
    66
    67
    68
    69
    70
    DCB           l_dcb;
        COMMTIMEOUTS  l_timeouts;
    
    	//Ouvre la communication sur le port serie
    	m_PortHandle = CreateFile(getPortName().data(),
                                   GENERIC_READ|GENERIC_WRITE,
                                   0,
                                   0,
                                   OPEN_EXISTING,
                                   FILE_FLAG_OVERLAPPED,
                                   0);
    
    	if (m_PortHandle == INVALID_HANDLE_VALUE )
    	{
                    m_PortHandle = NULL;
    		return 0;
    	}
    
    
        //Créer un overlapped event pour l'attente du car spéciale
        m_osStatus.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        if (m_osStatus.hEvent == NULL)
        {
            return 0;
        }
    
    
    	if (!PurgeComm(m_PortHandle,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR))
    	{
                 return 0;
    	}
    
    
    	//Configure la communication sur le port série
        l_timeouts.ReadIntervalTimeout         = MAXDWORD; 
        l_timeouts.ReadTotalTimeoutMultiplier  = 0;
        l_timeouts.ReadTotalTimeoutConstant    = 0;
        l_timeouts.WriteTotalTimeoutMultiplier = 0;
        l_timeouts.WriteTotalTimeoutConstant   = 30000;
    
    	if (!SetCommTimeouts(m_PortHandle, &l_timeouts))
    	{
                   return 0;
    	}
    
    	FillMemory(&l_dcb, sizeof(l_dcb), 0);
    	if (!GetCommState(m_PortHandle, &l_dcb))
    	{
                 return LNK_INITLIEN_KO;
    	}
    
    
    	l_dcb.BaudRate		= 38400 ;	
    	l_dcb.Parity      = 1;
    	l_dcb.StopBits    = 1;
    	l_dcb.ByteSize    = 8;
        l_dcb.EvtChar     = '\n';
    	
    	l_dcb.fDtrControl = DTR_CONTROL_ENABLE;
    	l_dcb.fRtsControl = RTS_CONTROL_ENABLE;
    	l_dcb.fOutxDsrFlow= FALSE;
    	l_dcb.fOutxCtsFlow= FALSE; 
    	l_dcb.fOutX	   = FALSE;
    	l_dcb.fInX		   = FALSE;
    
    	if(!SetCommState(m_PortHandle, &l_dcb))
    	{
            return 0;
    	}
    return 1;
    Avec ce bout de code l'initialisation retourne 0. Elle échoue dans le test
    if(!SetCommState(m_PortHandle, &l_dcb)), et si je fait l_dcb.StopBits =0 l'initialisation réussi.

    Comment je peux modifier l'attribut StopBits?

    2- Dans cette liaison, j'envoie un message binaire (par exemple 24 56 A2 00 00 54 E6 B4 21 00) mais lors de la réception je reçois le message suivant (24 56 22 00 00 54 66 34 21 00) càd (A ==> 2, E ==> 6, B ==> 3 ...).
    Donc, le 8 ème bit de chaque octet est toujours forcé à 0.
    Comment je peux résoudre ce problème?



    Merci pour vos réponses

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Le nombre de bits d'arrêt n'est pas égal le nombre spécifié, car il n'est pas forcément entier. Il faut donc utiliser les constantes:
    StopBits The number of stop bits to be used. This member can be one of the following values.
    Value - Meaning
    ONESTOPBIT (0) - 1 stop bit.
    ONE5STOPBITS (1) - 1.5 stop bits.
    TWOSTOPBITS (2) - 2 stop bits.
    Source: MSDN - DCB.
    Le code échouait car la valeur 1 correspond à 1.5 bits d'arrêt, et cette valeur est illégale avec 8 bits de données.
    The use of 5 data bits with 2 stop bits is an invalid combination, as is 6, 7, or 8 data bits with 1.5 stop bits.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau membre du Club Avatar de rzayani
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Merci, le problème de l'initialisation est résolu.

    Concernant le message bianire, j'ai essayé avec toutes les valeurs supérieurs à 8:

    Emission Recéption
    0x80 0x00
    0x90 0x10
    0xA0 0x20
    0xB0 0x30
    0xC0 0x40
    0xD0 0x50
    0xE0 0x60
    0xF0 0x70

    0x70 0x70

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Bizarre. On dirait que d'un côté ou de l'autre, seuls 7 bits sont correctement transmis.
    Vérifie le réglage du port des deux côtés (parité comprise: 1 signifie "impaire" et non pas "1 bit de parité")...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. problème avec un port série
    Par JuTs dans le forum Composants
    Réponses: 7
    Dernier message: 15/03/2008, 23h05
  2. Linux - problème avec fifos (communication IPC)
    Par wiliwiliwili dans le forum Linux
    Réponses: 4
    Dernier message: 27/08/2007, 22h18
  3. Problème avec la liaison série
    Par perchman dans le forum Général Python
    Réponses: 3
    Dernier message: 22/03/2007, 16h52
  4. [C#]Problème avec le port série sous Win98
    Par Polux63 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 29/09/2006, 09h14
  5. Problème avec le port série sous Windows XP
    Par didou2dek dans le forum Composants VCL
    Réponses: 6
    Dernier message: 02/09/2003, 19h50

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