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 :

Programmation en C pour Pic : utiliser HTTPGetVar


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut Programmation en C pour Pic : utiliser HTTPGetVar
    Bonjour,

    J'utilise un Pic Microchip avec controleur Ethernet pour renvoyer vers une page Web des états ou données collectés par le Pic.

    Le code suivant ( fonctionne bien ) me permet de faire afficher sur une page web l'etat : "1" ou "0" de plusieurs entrées du Pic.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define VAR_LED0               (0x00)
    #define VAR_ETAT_DIN1  	(0x0F)
    #define VAR_ETAT_DIN2  	(0x1A)
    #define VAR_ETAT_DIN3  	(0x1B)
    ...

    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
     
    /******************************************************************************
     * Function:        WORD HTTPGetVar(BYTE var, WORD ref, BYTE* val)
     * PreCondition:    None
     * Input:           var         - Variable Identifier
     *                  ref         - Current callback reference with
     *                                respect to 'var' variable.
     *                  val         - Buffer for value storage.
     * Output:          Variable reference as required by application.
     * Side Effects:    None
     * Overview:        This is a callback function from HTTPServer
     *                  Whenever a variable substitution is required on any html
     *                  pages, HTTPServer calls this function 8-bit variable 
     *                  identifier, variable reference, which indicates whether
     *                  this is a first call or not.  Application should return
     *                  one character at a time as a variable value.
     * Note:            Since this function only allows one character to be 
     *                  returned at a time as part of variable value, HTTPServer()
     *                  calls this function multiple times until 
     *                  indicates that there is no more value left for this
     *                  variable.
     *                  On begining, HTTPGetVar() is called with
     *                  ref = HTTP_START_OF_VAR to indicate that this is a first
     *                  call.  Application should use this reference to start the
     *                  variable value extraction and return updated reference.
     *                  If there is no more values left for this variable
     *                  application should send HTTP_END_OF_VAR. If there are any
     *                  bytes to send, application should return other than
     *                  HTTP_START_OF_VAR and HTTP_END_OF_VAR reference.
     *
     *                  THIS IS AN EXAMPLE CALLBACK.
     *                  MODIFY THIS AS PER YOUR REQUIREMENTS.
     ******************************************************************************/
    WORD HTTPGetVar(BYTE var, WORD ref, BYTE* val)
     
    {
        // Temporary variables designated for storage of a whole return result
        // to simplify logic needed since one byte must be returned at a time.
     
        static BYTE VarString[32];
     
    // Lit l'etats des ports :
    // Identify variable
     
     
        switch(var)
        {
     
        case VAR_LED0:
            *val = LED0_IO ? '1':'0';
            break;
     
        case VAR_ETAT_DIN1:
            *val = ETAT_DIN1 ? '1':'0';
            break;
     
        case VAR_ETAT_DIN2:
            *val = ETAT_DIN2 ? '1':'0';
            break;
     
        case VAR_ETAT_DIN3:
            *val = ETAT_DIN3 ? '1':'0';
            break;
    Sur le même principe je voudrais que lorsque mon Pic envoi via son port série la valeur 0x40 qu'un message définit soit affiché sur ma page Web.

    Cependant, le code suivant, ne fonctionne pas, pourriez vous me dire ce qui est faux, ou ce qu'il faudrait modifier ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define VAR_TEST_MESSAGE	(0x46)
    ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    case VAR_TEST_MESSAGE:
     
    		if (ref == HTTP_START_OF_VAR ) 
     
            if  (UART_TXREG == 0x40)
                  strcpypgm2ram(VarString, "0x40 envoyé sur le port série");
            else
                  strcpypgm2ram(VarString, "En attente d'envoi");
            break;

  2. #2
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour,

    Pourtant il existe de nombreux exemples sur le WEB....

    En voici un modifié pour ton usage:
    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
     
    case VAR_TEST_MESSAGE:
      if (ref == HTTP_START_OF_VAR ) {
        if (UART_TXREG == 0x40) {
          strncpypgm2ram((char*)VarString, "0x40 envoyé sur le port série", sizeof(VarString));
        }
        else {
          strncpypgm2ram((char*)VarString, "En attente d'envoi", sizeof(VarString));
        }
        *val = VarString[(BYTE)ref];
        if (VarString[(BYTE)ref] == '\0') {
          return HTTP_END_OF_VAR;
        }
        else if (VarString[(BYTE)++ref] == '\0') {
          return HTTP_END_OF_VAR;
        }
        return ref;
      }
      break;

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Merci beaucoup jowo, je vais essayer ce code dès ce soir, je vous tiens au courant


    Sur le même principe de code, puis je vous demander, ce que dois modifier, si à présent, je veux renvoyer sur ma page web grâce à httpgetvar une chaine de caractères reçue sur le Rx du port série du Pic ?

    Mon but étant de capturer une trame série reçue sur le port série du Pic et d'en afficher sur la page Web que l'information souhaitée.

    Je m'explique :

    si Rx du port série du Pic reçoit '$Entete ABCD' je voudrais que sur ma page Web s'affiche seulement 'ABCD' $Entete étant une entete pour identifier l'information qui suit.


    Je vous remercie beaucoup si vous pourriez m'aider.
    Cordialement,

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Rebonjour,

    J'ai essayé de compiler le code de Jowo, mais il ne semble pas fonctionner.

    Le compilateur indique 2 warnings :

    1502:Warning [2066] type qualifier mismatch in assignment
    1505:Warning [2066] type qualifier mismatch in assignment


    1502 correspond à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strncpypgm2ram((char*)VarString, "0x40 envoyé sur le port série", sizeof(VarString));
    et 1505 correspond à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strncpypgm2ram((char*)VarString, "En attente d'envoi", sizeof(VarString));
    Malgré les 2 warnings, j'ai programmé le Pic ...
    Lorsque le Pic envoi des valeurs hexa sur le port série : 0x40 (par exemple), le champ concerné n'est pas mis à jour sur ma page web .

    d'ailleurs, le message prédéfini " En attente d'envoi " ne s'affiche pas, je ne sais pas pourquoi.

    Logiquement httpgetvar devrait faire écrire "0x40 envoyé sur le port série" ou "En attente d'envoi" dans le champ, actuellement j'ai EE ou 00 qui s'inscrit.

    Pourriez vous m'aider ?

  5. #5
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Un petit problème d'accolade dans le code:
    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
    
    case VAR_TEST_MESSAGE:
      if (ref == HTTP_START_OF_VAR ) {
        if (UART_TXREG == 0x40) {
          strcpypgm2ram((char*)VarString, "0x40 envoyé sur le port série", sizeof VarString);
        }
        else {
          strcpypgm2ram((char*)VarString, "En attente d'envoi", sizeof VarString);
        }
        *val = VarString[(BYTE)ref];
      }
      if (VarString[(BYTE)ref] == '\0') {
        return HTTP_END_OF_VAR;
      }
      else if (VarString[(BYTE)++ref] == '\0') {
        return HTTP_END_OF_VAR;
      }
      return ref;
      break;
    Attention: j'utilise strcpypgm2ram à la place de strncpypgm2ram

    Pour ton problème de "Warning", je suspecte la déclaration des messages. Il faudrait les déclarer autrement.

    Pas testé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    rom const char *rom MESSAGE[] = {
       "0x40 envoyé sur le port série", 
       "En attente d'envoi"};

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    j'ai cette erreur pour ces 2 lignes :

    Error [1204] too many arguments in function call

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpypgm2ram((char*)VarString, "0x40 envoyé sur le port série", sizeof VarString);
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpypgm2ram((char*)VarString, "En attente d'envoi", sizeof VarString);
    Avec votre nouveau code, je n'ai pas eu de warnings cette fois-ci ...

    ------------------------

    Dans le programme que j'utilise, j'ai un exemple de httpgetvar qui fonctionne mais il se présente différemment du votre, comment pourrait-on adapter celui-ci à mon application ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    case VAR_STACK_VERSION:
     
            if( ref == HTTP_START_OF_VAR )
            {
                strcpypgm2ram(VarString, VERSION);
            }
     
            *val = VarString[(BYTE)ref];
     
            if(VarString[(BYTE)ref] == '\0')
                return HTTP_END_OF_VAR;
            else if(VarString[(BYTE)++ref] == '\0' )
                return HTTP_END_OF_VAR;
            return ref;

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/03/2009, 23h46
  2. Réponses: 21
    Dernier message: 30/03/2009, 00h00
  3. Réponses: 5
    Dernier message: 22/11/2007, 20h12
  4. programme en C pour PIC
    Par danbike19 dans le forum C
    Réponses: 1
    Dernier message: 14/11/2007, 11h34
  5. [pic 16f84] programmation en c pour RS 232
    Par nojnoj dans le forum C
    Réponses: 2
    Dernier message: 19/03/2007, 11h55

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