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 :

Lecture du COM2 au fil de l'eau


Sujet :

C

  1. #21
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par 202UH
    Si tu as une source de programme qui me permet également de lire les comms et de les afficher dans une fenêtre DOS,
    Qu'appeles-tu 'fenêtre DOS' ?
    ça m'interresse également car on viens de m'informer qu'il faudra également faire la manipe sur 3 anciennes installations ou on ne dispose que d'un vieux pc sous dos.
    Quelle machine ? Quel système ?

    Le principe d'implémentation des ports série des PC est le suivant.

    1 - Le port série des PC est géré par un composant appelé UART. Le modèle est 8250

    http://www.marshallsoft.com/serial.htm

    Il dispose d'une série de registres (adresses relatives 0 à 7) et la doc indique les procédures permettant de configurer le format, piloter les circuits RS-232 du modem, d'émettre et de de recevoir un caractère. Il dispose d'un mécanisme d'interruption matérielle (broche INT)

    2 - Dans un PC (intel x86), il est câblé sur le bus I/O à une adresse qui peut changer d'un machine à l'autre, mais qui peut être lue en mode réel dans la zone BIOS data du PC (c'est indépendant du système) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Microsoft Windows XP [version 5.1.2600]
    (C) Copyright 1985-2001 Microsoft Corp.
     
    C:\dev\forums2>debug
    -d 40:0
    0040:0000  F8 03 F8 02 E8 03 E8 02-BC 03 78 03 78 02 C0 9F   ..........x.x...
    <...>
    -q
     
    C:\dev\forums2>
    Les adresses de bases des UART des ports COM1 à COM4 sont stockée dans les 8 premiers octets de ce tableau. Ce sont des mots de 16-bit LSB en tête (little endian).

    F8 03 indique que l'adresse de l'UART de COM1 est en 03F8
    F8 02 indique que l'adresse de l'UART de COM2 est en 02F8
    etc, jusqu'à COM4. Si l'adresse est 0 (00 00), c'est qu'il n'y a pas d'UART sur ce port.

    (Je suis un peu étonné de lire ça sur mon portable qui n'a pas de port COM, mais c'est peut être les ports USB. Je ne connais pas les architectures matérielles modernes)

    3 - Dans un PC, avant d'être envoyé au PIC (circuit gestionnaire d'interruption) le signal d'interruption INT de l'UART est soumis à une condition pilotée par la broche OUT2 de ce même UART. On peut donc activer ou non l'interruption matérielle par l'UART lui même.

    En gros, on a çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     ------             -----
    | UART |INT ------>|  &  |---> IRQ
    |      |OUT2 ----->|     |
     ------             -----
    4 - Dans un PC, généralement COM1 est relié à IRQ4 et COM2 à IRQ3, mais c'est parfois programmable. Voir la configuration du BIOS.

    5 - Avec Turbo C et les fonctions inportb() et outportb() de <dos.h> permettant un accès au bus IO, il est possible de configurer et de gérer l'UART directement. On peut même installer un gestionnaire d'interruption et gérer le PIC (Programmable Interrupt Controller) pour une meilleure efficacité. Ce n'est pas trivial et ça ne fonctionne évidemment qu'en mode réel. J'ai fait ça dans ma jeunesse (années 90), et des bancs de tests (2 ports série full duplex à 1200 bauds) tournent encore avec ces routines sur de vieux PC sous DOS/Windows 3x (16-bit) ou 9x sous VM (Virtual Machine) 16-bit.

    6 - Dans un PC, le BIOS offre un certain nombre de fonction (INT14h) qui permettent une gestion simple du port série en mode polling (sans interruption). Ca peu suffire dans des cas simples (imprimante série, émulation un terminal lent, dialogue lent half duplex). Turbo C donne un accès direct à ces fonctions qu'il appelle bioscom(). Evidemment, ça ne fonctionne qu'en mode réel 16-bit.

    7 - Dans un PC sous DOS, le système permet d'ouvrir les flux "COM1" à "COM4" comme des fichiers et décrire dessus. pour la réception, c'est plus délicat. Le système prend en charge les signaux RS-232 (ou V.24) du modem et si certains signaux issus du modem (ou supposé tel) ne sont pas dans le bon état (DSR,CTS,CD), la liaison est considérée en défaut et ça provoque une erreur.

    Dans un programme en C, on peut donc utiliser fopen() etc.

    Une fois encore, le système utilisant directement les fonctions de INT14 du BIOS, le débit est faible et la communication ne peut se faire qu'en half-duplex.

    8 - Sur un PC avec système DOS/Windows 16 bits (2.x, 3x), le port série est enfin et complètement pris en charge par le système. J'ai oublié le nom des fonctions et je ne sais pas si on peut encore trouver de la doc...

    9 - Sur un PC avec système DOS/Windows 32-bit (9x, 2k) ou Windows NT (NTx, Me, XP), la prise en charge du port série est complète et se fait par des fonctions fichier bas niveau et des mécanismes plus ou moins complexes selon qu'on cherche des accès synchrones (bloquants, séquentiels, simples) ou asynchrones (non-bloquants, plus complexes, gestion par évènements).

    Voilà, je pense avoir fait le tour de la question...

    Pose des questions si il y a des mots, des expressions ou des concepts que tu ne comprends pas. Je ne connais pas ta 'culture informatique'.
    Pas de Wi-Fi à la maison : CPL

  2. #22
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Points : 2
    Points
    2
    Par défaut
    Je te joints une source que essayé. 1 pc en hyper et 1 autre avec l'exe du programme compilé. C'est un essai avec juste un transfère de caractère. Mon problème, quand j'envoie un caract. avec un pc, il faut que je renvoie un caract. avec l'autre pour pouvoir afficher le précédent caract. à l'écran. Je cherche à modifier la boucle do du prog pour réceptionnner les caract. que je tape sur un pc sans être obligé de répondre avec une saisie clavier sur l'autre. Compile la source et essaies si tu peux. Tu te rendras mieux compte de mon problème. Merci.
    Fichiers attachés Fichiers attachés

  3. #23
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Points : 2
    Points
    2
    Par défaut
    Petit OUBLIE : dans la source que j'ai compilé j'ai changer l'initialisation du port com2 en 9600 bauds, 8 bits de données, 1 bit de stop et pas de parité.

  4. #24
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par 202UH
    Je te joints une source que essayé. 1 pc en hyper et 1 autre avec l'exe du programme compilé. C'est un essai avec juste un transfère de caractère. Mon problème, quand j'envoie un caract. avec un pc, il faut que je renvoie un caract. avec l'autre pour pouvoir afficher le précédent caract. à l'écran. Je cherche à modifier la boucle do du prog pour réceptionnner les caract. que je tape sur un pc sans être obligé de répondre avec une saisie clavier sur l'autre. Compile la source et essaies si tu peux. Tu te rendras mieux compte de mon problème. Merci.
    Est-tu bien conscient que ce code ne peut fonctionner sur sous
    • MS-DOS
    • Windows 3x
    • Windows 9x

    Moi, je suis sous XP, ce genre de code m'est interdit.

    Quelques remarques non exhaustives...
    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
     
    #include <stdio.h>
    #include <dos.h>
    #include <conio.h>
     
    // Registres UART port COM2
     
    #define ESC 0x1b
    #define THR_RBR 0x2F8
    #define IER     0x2F9
    #define IIR     0x2FA
    #define LCR     0x2FB
    #define MCR     0x2FC
    #define LSR     0x2FD
    #define MSR     0x2FE
     
    // ParamŠtres de la liaison
     
     
    #define DONNE_7  0x02
    #define DONNE_8  0x03
    #define STOP_1   0x00
    #define STOP_2   0x04
    #define NONE     0x00
    #define IMPAIRE  0x08
    #define PAIRE    0x18
    #define DLAB	 0x80	// AccŠs au diviseur de fr‚quence
    #define RAZ_DLAB 0x7F
     
    #define _600_BAUDS    192
    #define _1200_BAUDS    96
    #define _2400_BAUDS    48
    #define _4800_BAUDS    24
    #define _9600_BAUDS    12
     
    /* -ed- curieux numero. Tu es sur ? J'aurais dit 8 + 3 = 11 (0x0B), PIC principal... */
    #define  INTR		 0x23 // interruption interface s‚rie num‚ro 2
     
    void interrupt ( *oldhandler)(void);
     
    /* -ed- l'usage des globales est rarement justifie... */
    unsigned char init_liaison;
    unsigned char car_recu;
     
     void interrupt handler(void)
     {
    /* -ed- je ne sais pas ce que tu cherches a faire ici, 
    mais on ne peut pas appeler puts() sous interruptions. */
     
       puts("OK=OK=OK=OK=OK=OK");
     }
     
    /* -ed- main() retourne int. Toujours */
    void main()
     {
       unsigned char car_lu;
     
       clrscr();
     
     
       /* Initialisation du port s‚rie
          7 bits de donn‚es, i bit de stop, parit‚ paire, 9600 bauds.
       */
     
        outportb(IER,0x01);
     
      init_liaison = DONNE_7|STOP_1|PAIRE|DLAB; //DLAB positionn‚ pour
    	 		 		     //faire la s‚lection
    	 		 		     //de la vitesse de transmission.
     
      outportb(LCR,init_liaison);
     
      // Configuration de la vitesse 9600 bauds
     
      outportb(THR_RBR,_9600_BAUDS);
     
      //Puis, RAZ bit 7 du LCR
     
      init_liaison &= RAZ_DLAB;
     
      //Envoyer … nouveau la configuration au LCR avec le bit 7 (DLAB) … 0
     
      outportb(LCR,init_liaison);
     
     
    /* -ed- Malheureux ! Il faut proteger cette section contre les interruptions */
       disable();
     
       /* sauvegarde l'ancien vecteur d'interruption */
        oldhandler = getvect(INTR);
     
     /* installe le nouveau gestionnaire d'interruption*/
        setvect(INTR, handler);
     
    /* -ed- fin de section protegee */
       enable();
     
      // Boucle d‚mission et de r‚ception
     
       do
        {
     
          car_lu = getch();
     
          // V‚rifier que le bit 5 du LSR, signifiant que le
          // tampon d'‚mission est vide, est … 1
     
    /* -ed- alors polling ou interruption ? Il faut se decider... */
          while(!(inportb(LSR)&0x20)); /* ce bit a un nom... */
     
          // Emetre le caractŠre car_lu
     
          outportb(THR_RBR,car_lu);
     
          // V‚rifier que le bit 0 du LSR, signifiant qu'un
          // caractŠre est arriv‚, est … 1
     
    /* -ed- arrive ? Ah oui, tu veux dire 'recu'... */
          while(!(inportb(LSR)&0x01)); /* ce bit a aussi un nom... */
          car_recu = inportb(THR_RBR);   // On vide aussi le tampon
     
    /* -ed- Illogique. getch() / putch()... */
          printf("%c",car_recu);
     
        } while(car_lu !=ESC);
     
         /* restaure l'ancien gestionnaire d'interruption */
        setvect(INTR, oldhandler);
     
        /* -ed- certes, mais pourquoi avoir installe une interuption si c'est pour ne pas s'en servir ? */
    }
    La logique du code parait correcte, mais elle s'appuie sur des mécanismes blocants en durs, ce qui est assez moyen et explique probablement le comportement que tu observes...

    Je ferais comme ça pour faire un terminal :
    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
     
    int fin = 0;
     
    while (!fin)
    {
       /* clavier */
       if (kbhit ())
       {
          int c = getch();
          fin = c == 27;
     
          /* tel quel, le ESC est transmis en ligne... */
          outportb (Tx, c);
     
         /* leger blocage pendant l'emission  */
          while (! (inportb (LSR) & TxBE)) /* LSR.5 : Transmit Buffer Empty */
             ;
     
       }
     
       /* port serie en reception */
       if (inportb (LSR) & DR) /* LSR.0 : Data Ready */
       {
          int c = inportb (Rx);
          putch (c);
       }
    }
    Pas de Wi-Fi à la maison : CPL

  5. #25
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Points : 2
    Points
    2
    Par défaut
    Après tous les conseils reçus, j'ai compilé le programme ci-joint. Quand je branche mon pc avec le boîtier hélium, à chaque fin de test j'ai la trame du résultat qui s'affiche. Elle est la suivante :
    <16>:(PB): 1665 l/h
    C'est déjà un très bon résultat après le dur départ que j'avais pris dans mon projet. Maintenant je voudrais afficher à l'écran que la partie 1665 l/h. Comment configurer la trame, couper le partie inutile et afficher le restant? Ensuite je devrai l'enregiter dans un fichier excel. Merci d'avance...
    Fichiers attachés Fichiers attachés

  6. #26
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par 202UH
    <16>:(PB): 1665 l/h
    C'est déjà un très bon résultat après le dur départ que j'avais pris dans mon projet. Maintenant je voudrais afficher à l'écran que la partie 1665 l/h. Comment configurer la trame, couper le partie inutile et afficher le restant? Ensuite je devrai l'enregiter dans un fichier excel. Merci d'avance...
    Isoler les traitements.

    Y'a-t-il une marque de fin de message claire, genre code 10 ('\n') ou 13 ('\r') (Normalement, c'est écrit dans la doc du constructeur du capteur).

    Au lieu de putch(c); fait un printf ("%d\n",c); Ca donne quoi quand tu reçois le message ?

    Si la fin de message est claire, il faut récupérer les caractères dans un tableau de char de talle adéquate, avec un indice à gérer intelligemment... mettre un 0 au bout quand on reçoit la marque de fin de message. On aurait alors une chaine de caractères C.

    Ca devient du C classique. Tu peux t'aider du ":" ou de la sequence "):" pour repérer le début de ce qui t'intéresse, et le recopier. Tu ne veux pas une valeur numérique plutôt ? Tu as besoin du l/h ?
    Pas de Wi-Fi à la maison : CPL

  7. #27
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Points : 2
    Points
    2
    Par défaut
    D'après la doc, il n'y a plus rien après la chaine que je t'ai donné. Par contre, en hyperterm j'ai un retour chariot qui se fait car la nouvelle mesure apparaît sous la précédente. A mon avis il ont oubliés le retour chariot dans la doc.Pour le l/h, on peut le laisser tomber.

  8. #28
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Points : 2
    Points
    2
    Par défaut
    voilà un extrait de la doc du constructeur au sujet de la trame.
    Images attachées Images attachées  

  9. #29
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par 202UH
    voilà un extrait de la doc du constructeur au sujet de la trame.
    Si le format est fixe tu peux te la jouer à la barbare :

    on a stocké les caractères (pas besoin de 0 supplémentaire)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       char data[40]; 
       /* simulation de la reception  */
       strcpy (data, "<16>:(PB): 1665 l/h");
     
       /* extraction de la chaine de resultat : */
       char resultat[6] = "";
       strncat (resultat, data + 11, 5);
     
       /* soit on utilise la chaine directement,
           soit on la converti en valeur numerique : 
       */
       long valeur = strtol (resultat, NULL, 10);
    Pas de Wi-Fi à la maison : CPL

  10. #30
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par 202UH
    D'après la doc, il n'y a plus rien après la chaine que je t'ai donné. Par contre, en hyperterm j'ai un retour chariot qui se fait car la nouvelle mesure apparaît sous la précédente. A mon avis il ont oubliés le retour chariot dans la doc.Pour le l/h, on peut le laisser tomber.
    Il faut vérifier quel caractère est reçu de la manière que je t'ai indiqué, et s'en servir pour synchroniser et déclencher l'évènement' réception' qui va activer le traitement de la donné.

    Je ne pense pas que le ou les caractères aient été oubliés, mais ils doivent être définis ailleurs dans la doc dans un chapitre 'format général des trames ou 'protocole'', genre comme ça :

    Le format des trames est :
    et le tableau que tu m'as montré est simplement le détail de <data>.

    Mais je m'avance peut être...
    Pas de Wi-Fi à la maison : CPL

  11. #31
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Points : 2
    Points
    2
    Par défaut
    J'ai essayé la manière strcpy, sctncat, mais rien ne saffiche à l'écran. Faut peut être finir avec printf pour afficher la chaîne? Je ne sais pas trop. Je crois que pour une chaine de caract il faut un %s dans le printf. Par contre, dans la doc constructeur, il n'y a aucun autre renseignement pour la com.

  12. #32
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par 202UH
    J'ai essayé la manière strcpy, sctncat,
    strncat()...
    mais rien ne saffiche à l'écran.
    Ce sont des fonctions de manipulation de chaines, pas d'affichage...
    Faut peut être finir avec printf pour afficher la chaîne? Je ne sais pas trop.
    Utiliser printf() pour afficher, oui, ça me parait pas mal... mais c'est pas un scoop.

    Tu n'as jamais fait de C ? C'est pas un langage de jouet qu'on apprend en 5 minutes pendant un projet. C'est un langage sérieux puissant et très subtil qui demande du temps de formation...

    "C is a sharp tool"

    Des références de livres et de tutoriels sur mon site. Je donne des cours particuliers en RP.

    Je crois que pour une chaine de caract il faut un %s dans le printf.
    Oui, comme écrit dans ton livre de C...
    Par contre, dans la doc constructeur, il n'y a aucun autre renseignement pour la com.
    OK. La trace que je t'ai demandé de faire, elle donne quoi ?
    Pas de Wi-Fi à la maison : CPL

  13. #33
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Points : 2
    Points
    2
    Par défaut
    J'ai rajouté un printf("%s", resultat); et il m'affiche 1665 à l'écran. Problème : à la fin du premier teste du capteur, le prog rentre dans la boucle if et après l'avoir executée il sort et rentre imédiatement à nouveau dans la boucle et cela à l'infinit. Deuxième problème, la valeur 1665 est la valeur qui change à chaque mesure. Comment afficher la valeur mesurée et non en permanence 1665? Merci

  14. #34
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par 202UH
    J'ai rajouté un printf("%s", resultat);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s\n", resultat);
    et il m'affiche 1665 à l'écran. Problème : à la fin du premier teste du capteur, le prog rentre dans la boucle if et après l'avoir executée il sort et rentre imédiatement à nouveau dans la boucle et cela à l'infinit. Deuxième problème, la valeur 1665 est la valeur qui change à chaque mesure. Comment afficher la valeur mesurée et non en permanence 1665?
    Sans voir le code, ça va être dur...
    Pas de Wi-Fi à la maison : CPL

  15. #35
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Points : 2
    Points
    2
    Par défaut
    Comme je n'utilise plus le putch (c); j'avais supprimé la ligne int c = inportb (THR_RBR);
    J 'ai remis au début de la boucle if, la ligne suivante :
    inportb (THR_RBH);
    Cà m'a permis de vider le tampon et maintenant, je ne rentre plus dans la boucle if en permanence. Il faut un nouveau teste du capteur pour l'executer.

  16. #36
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par 202UH
    Comme je n'utilise plus le putch (c); j'avais supprimé la ligne int c = inportb (THR_RBR);
    J 'ai remis au début de la boucle if, la ligne suivante :
    inportb (THR_RBH);
    Cà m'a permis de vider le tampon et maintenant, je ne rentre plus dans la boucle if en permanence. Il faut un nouveau teste du capteur pour l'executer.
    Tant que je ne vois pas le code...
    Pas de Wi-Fi à la maison : CPL

  17. #37
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Points : 2
    Points
    2
    Par défaut
    Si on pose l'hypothèse qu'il y a une marque de fin de message ('\n'), peut on continuer dans cette direction? J'ai relu toute la doc du construct. il n'y a pas d'autres infos sur la trame. La seul chose que j'ai trouvé,c'est les valeurs de config du port com qu'on connaît déjà. Dans la bible du C, ils parlent d'un caractère nul \0 qui annonce la fin de la chaîne de caractères. Peut tu éventuellement exploiter cette piste?

  18. #38
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par 202UH
    Si on pose l'hypothèse qu'il y a une marque de fin de message ('\n'), peut on continuer dans cette direction?
    Oui, mais il faut plus qu'une hypothèse. Je t'ai demandé de faire une manip de confirmation.

    Citation Envoyé par rappel
    Au lieu de putch(c); fait un printf ("%d\n",c); Ca donne quoi quand tu reçois le message ?
    Si tu ne la fais pas, je ne peux rien pour toi. On ne peut pas programmer au hasard.
    J'ai relu toute la doc du construct. il n'y a pas d'autres infos sur la trame. La seul chose que j'ai trouvé,c'est les valeurs de config du port com qu'on connaît déjà. Dans la bible du C, ils parlent d'un caractère nul \0 qui annonce la fin de la chaîne de caractères. Peut tu éventuellement exploiter cette piste?
    Rien à voir. Une chaine C ne concerne que le C, pas un capteur externe....
    Pas de Wi-Fi à la maison : CPL

  19. #39
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Novembre 2006
    Messages : 54
    Points : 2
    Points
    2
    Par défaut
    J'ai fais la manipe demandée avec le printf, le résultat est :10
    merci à plus.

  20. #40
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par 202UH
    J'ai fais la manipe demandée avec le printf, le résultat est :10
    merci à plus.
    OK. Donc, bien que la doc ne le précise pas, le capteur envoie bien un LF (10).

    On peut donc bien utiliser ce caractère pour délimiter la fin de message.

    Afin d'être indépendant de ton implémentation du C, je conseille de définir une constante EOL (End Of Line) :
    ou
    Et de l'utiliser dans le programme à chaque fois que tu dois tester la fin de ligne en provenance du capteur.

    Tu dois maintenant être en mesure d'écrire le code qui récupère les caractères, en fait une chaine C valide et en extrait la valeur numérique.

    Tu peux poster ton code pour vérification si tu as un doute ou si il ne fonctionne pas...
    Pas de Wi-Fi à la maison : CPL

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Faire une fenêtre de log "au fil de l'eau"
    Par tio dans le forum Zend Framework
    Réponses: 1
    Dernier message: 20/02/2009, 18h54
  2. [AJAX] Affichage d'une variable au fils de l'eau (flux PHP)
    Par Jonathan.b dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/10/2007, 13h25
  3. messages à l'utilisateur au fil de l'eau
    Par thmane dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/10/2006, 11h51
  4. [VB.Net] Impression fil de l'eau
    Par Silvinho42 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/10/2005, 10h43
  5. [IO] downloader au fil de l'eau
    Par Ekros dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 09/06/2005, 09h04

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