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 :

Sous échantillonnage dans une liaison serie


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 27
    Points : 26
    Points
    26
    Par défaut Sous échantillonnage dans une liaison serie
    Bonjour,
    J'ai une liaison série 422 mono directionnelle asynchrone, qui émet les trames avec une fréquence de 50 Hz.
    Dans la réception, il faut recevoir les données avec une fréquence de 1Hz. Donc il faut sous échantillonner les trames : Lire un message chaque seconde.
    Et pour lire un message du buffer je vais utilisé la fonction suivante:
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    receive(CMessage* i_message)
    {
     
        DWORD      dwRes;
        DWORD      dwCommEvent;
        DWORD      dwOvRes;
    	BOOL       fWaitingOnStat = FALSE;
    	char       chread[2];
     
        DWORD      dwRead   = 0;
        OVERLAPPED osReader = {0};
        LPDWORD    lpErrors = 0;
    	int        i        = 0;
    	chread[0]           = m_Context->getEventChar();
    	chread[1]           = 0;
     
        if (m_WaitOnRead == 0) 
        {                
            /* Lancer une opération d'attente du car spéciale           */
     
            /* 
             * Si le car spéciale n'est pas arrivé, la méthode d'attente à 
             * retournée immédiatement avec une erreur. On traite l'erreur 
             */
            if (!WaitCommEvent(m_PortHandle, 
                               &dwCommEvent, 
                               &m_osStatus)) 
            {
                /* Si l'opération est en cours */
                if (GetLastError() == ERROR_IO_PENDING)
                {
                    m_WaitOnRead = 1;
                }
     
                /* Si l'attente retourne un cas d'erreur */
                else
                { 
                    return;
                }
            }
     
            /* 
             * le car spéciale est arrivé, la méthode d'attente a retournée
             * immédiatement. On lit les données qui sont dans le buffer de
             * lecture du port.
             */
            else
            {
    			i_message->m_data = "";
    			i                   = 0;
     
    			ReadFile(m_PortHandle,chread,1,&dwRead,&osReader);
    			while (chread[0] != m_Context->getEventChar())
    			{
    				if (chread[0] == 0)
    				{
    					i_message->m_data.append("-");
    					i_message->m_data[i_message->m_data.length() -1] = 0;
    				}
    				else
    				{
    					i_message->m_data.append(chread);
    				}						
    				ReadFile(m_PortHandle,chread,1,&dwRead,&osReader);
    				i++;
    			}
    			i_message->m_data.append( chread);
     
            }
        }
     
    	/* Attendre le résultat de l'opération d'attente en cours */
        if (m_WaitOnRead == 1) 
        {
     
            dwRes = WaitForSingleObject(m_osStatus.hEvent,m_Context->getReadTimeOut());
     
            /* traiter le résultat de l'attente */
            switch(dwRes)
            {
     
                /* 
                 * Un évennement s'est produit, on test s'il s'agit 
                 * d'une erreur ou que le car spéciale est arrivé. 
                 */
                case WAIT_OBJECT_0: 
     
                    /* Erreur */
                    if (!GetOverlappedResult(m_PortHandle,&m_osStatus,&dwOvRes,FALSE))
                    {
    					m_WaitOnRead = 0;
                        return;
                    }
                    /* Car spéciale arrivé */
                    else
                    {
    					i_message->m_data = "";
    					i                   = 0;
     
    					ReadFile(m_PortHandle,chread,1,&dwRead,&osReader);
    					while (chread[0] != m_Context->getEventChar())
    					{
    						if (chread[0] == 0)
    						{
    							i_message->m_data.append("-");
    							i_message->m_data[i_message->m_data.length() -1] = 0;
    						}
    						else
    						{
    							i_message->m_data.append(chread);
    						}						
    						ReadFile(m_PortHandle,chread,1,&dwRead,&osReader);
    						i++;
    					}
    					i_message->m_data.append( chread);
    					m_WaitOnRead   = 0;					
                    }                
                    break;
     
     
                /* Le time out s'est écoulé sans que le car spéciale arrive */
                case WAIT_TIMEOUT:  
     
    				CancelIo(m_PortHandle);
    				m_WaitOnRead = 0;
     
    //				TRACE ("LNK_CLinkRS::Receive - ERROR READING TIMEOUT\n");
                    break;
     
                /* traiter les cas restants */
                default:
     
    				CancelIo(m_PortHandle);
    				m_WaitOnRead = 0;
     
                    break;
            }
        }
    }

    Et pour lire les messages, je vais utilisé un thread.
    Ma question est: Est ce qu'il suffit d'appeler la fonction receive chaque seconde pour lire les messages avec une frequence de 1Hz (Donc, il faut que la fonction receive lit le dernier message reçu) ?
    Ou il faut lire tous les messages et prendre le 51 ème (puisque l'envoie est à 50Hz) sachant que la liaison est asynchrone? sinon y a t'il une autre solution?

    Merci pour vos aides

  2. #2
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    il faut envoyer au maximum un message toutes les secondes, sinon tu vas perdre de l'information.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 27
    Points : 26
    Points
    26
    Par défaut
    Oui, je veux envoyer 50 messages par secondes et lire un seul message chaque seconde. Donc je veux pas lire tous les messages.

Discussions similaires

  1. Réponses: 28
    Dernier message: 22/09/2005, 11h57
  2. je cherche une sous chaine dans une chaine
    Par avprive dans le forum C++
    Réponses: 3
    Dernier message: 17/03/2005, 01h48
  3. Rechercher une sous chaine dans une chaine
    Par annedjomo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/02/2005, 10h36
  4. Rechercher une sous chaine dans une chaine
    Par Oluha dans le forum ASP
    Réponses: 4
    Dernier message: 03/02/2005, 14h39
  5. Extraction de sous-chaine dans une chaine
    Par ma2th dans le forum C
    Réponses: 7
    Dernier message: 07/05/2004, 12h42

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