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++Builder Discussion :

TPortCom sur le Com 2


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 30
    Par défaut TPortCom sur le Com 2
    Bonjour à tous

    je développe en ce moment un logiciel de Taxation telephonique utilisant le Port Série.
    le PABX envoi les informations de taxation à un pc via ce Port Com.

    pour continuer mes test j'ai donc créé un "multiplicateur de port série" qui m'envoi le signal sur les 2 ports com du PC.

    j'ai donc le logiciel habituel qui tourne sur le Com1 et je fais mes test sur le Com2.
    pas de problème lorsque je test avec l'hyper-terminal: j'ai les données sur les 2
    cependant, avec les logiciels que je développe sous Borland en utilisant le TPortCom, si un autre logiciel est lancer sur le Com1, il refuse de se connecter sur le Com2, et si il est lancer avant, les autres logiciels ne fonctionnent plus car il n'arrive plus à ouvrir le port com non utilisé...

    quelqu'un aurait-il une idée ou une solution pour moi?

    merci
    tibo

  2. #2
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Perso je me suis fais une librairie utilissant les API Windows pour utiliser le(s) port(s) COM.
    Tu peux la trouver sur le post suivant et prochainement sur la FAQ.

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Par défaut
    A mon sens tu dois déja avoir en conception la propriété à connected = true.

    Met ça à false dans tes deux Com et ensuite, par programme remet cette propriété à true uniquement lorsque tu le souhaite ou lorsque tu en as le besoin

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 30
    Par défaut
    En effet, je met biensur le com 1 (ou 2 le résultat est le même) à connected=true
    le truc est qu'il faudrait que le 2ème port reste disponible pour le 2ème programme
    est-ce possible??

    Bandi Boy, j'ai regardé ton lien sur l'API Windows et ça m'interesse
    si tu as plus d'info je suis preneur


    A+
    tibo

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Par défaut
    Si les deux sont à connected = false (et que ton programme ne les bascule pas à True) aucune réservation n'est faite donc aucun gène pour ouvrir d'autres application qui prennent ces ports.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 30
    Par défaut
    prenons un exemple complet
    j'ai un programme qui se sert du Com 1
    je lance mon programme et j'essai de le démarrer sur le Com 2 -> Erreur
    je quitte le premier programme
    je lance le mien et je connect sans problème sur le Com 2
    je relance le premier programme ->Erreur, impossible d'ouvrir le Com 1

    où est l'erreur?

    merci
    tibo

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Par défaut
    Je me suis mal exprimé:
    Soit tes composant sont déja à connected = true à la base, soit c'est toi qui les valide à true.

    Je n'est jamais eut ce PB lorsque le ou les composant sont à false.

    au pire choisi un com qui n'existe pas (mais tu aura une erreur au lancement dans l'IDE même avec un <try>, mais c'est pas grave).

    N'oublis pas que même en mode conception (sans lancer ton programme), si le composant est à connected = true cela te réserve déja le port.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 30
    Par défaut
    il faudra que je test
    il s'agit en fait d'un programme de taxation telephonique relié à un PABX

    le problème et que là le pc sur lequel il tournait à rendu l'ame et qu'avec celui qui le remplace, je n'arrive pas à accéder au com2... (pourtant le PC à bien 2 ports com)

    A+
    tibo

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Par défaut
    Regarde du côté matériel/driver si c'est bien Com1 et Com2, ce peut être d'autres com

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 30
    Par défaut
    il n'aparait qu'un seul port com dans le gestionnaire de materiel
    je me demande si c'est pas une histoire de BIOS mais j'ai pas d'accé physique à la machine dans l'immédia...

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Par défaut
    Bon ben je crois que tu as ta réponse, même les ports virtuels on les vois..

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 30
    Par défaut
    ça viendrai d'un conflit d'adressage dans le BIOS?

  13. #13
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Par défaut
    Peut être, ou alors le driver mal installé; de toute façon si tu ne vois pas le com dans ta configuration matérielle ça ne sert à rien d'aller plus loint.

    Résoud ce PB et le reste devrait suivre

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 30
    Par défaut
    les test dont je parle dans mon premier post on été fait sur un autre pc sur lequel les 2 port com fonctionnés (je pouvais accéder aux 2 via l'hyperterminal)

    malheureusement, après 3ans de 24h/24 ce pauvre vieu à rendu l'ame

    mais là je ne peut pas continuer mes test car le pc qui le remplace ne vois pas son 2ème port com

    je vient de jetté un coup d'oeil dans le bios d'une autre machine identique que j'ai sous la mains:
    -Com1 3F8 IRQ4
    -Com2 2F8 IRQ3
    et elle vois les 2 ports coms sous windows
    je croit que demaine une visite s'impose dans le bios de ma machine

    A+
    tibo

  15. #15
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Salut, si le code t'intéresse toujours, voilà le code pour dialoguer sur un port COM:
    dans le .c
    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
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
     
    //---------------------------------------------------------------------------
    __fastcall TThreadCOM::TThreadCOM(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TThreadCOM::CloseComPort(void)
    {
    	EscapeCommFunction(comHandle, CLRDTR);
    	CloseHandle(comHandle);
    }
    //---------------------------------------------------------------------------
    bool __fastcall TThreadCOM::WriteComPort(AnsiString msg)
    {
         int     Emission_nb_octets = msg.Length();
         char    *trame_envoi="";
         DWORD   numWrite;
     
         strcpy(trame_envoi,msg.c_str());
         if (WriteFile(comHandle, trame_envoi, Emission_nb_octets, &numWrite, 0) == FALSE)  return false;
         else  										return true;
    }
    //---------------------------------------------------------------------------
    HANDLE __fastcall TThreadCOM::OpenComPort(AnsiString COMport, unsigned int comspeed)
    {
      if(!EndThread && CheckCOMAvailibility(COMport))
      {
    // Open the COM port
     
        COMport = "\\\\.\\" + COMport;
     
        comHandle = CreateFile(COMport.c_str(),
                               GENERIC_READ|GENERIC_WRITE,
                               0,
                               0,
                               OPEN_EXISTING,
                               FILE_ATTRIBUTE_NORMAL,
                               0);
     
     
        if (comHandle == INVALID_HANDLE_VALUE)
           return (INVALID_HANDLE_VALUE);
     
    // Get the current settings of the COMM port
        success = GetCommState(comHandle, &dcb);
        if (!success)
           return (INVALID_HANDLE_VALUE);
     
    // Modify the baud rate, etc.
        dcb.BaudRate      = comspeed;
        dcb.ByteSize      = 8;
        dcb.Parity        = NOPARITY;
        dcb.StopBits      = ONESTOPBIT;
        dcb.fOutxCtsFlow  = FALSE;
        dcb.fOutxDsrFlow  = FALSE;
        dcb.fDtrControl   = DTR_CONTROL_DISABLE;
        dcb.fRtsControl   = RTS_CONTROL_DISABLE;
        dcb.fAbortOnError = 0;
     
    // Apply the new comm port settings
        success = SetCommState(comHandle, &dcb);
        if (!success)
        {
           Application->MessageBox(AnsiString("Erreur Windows n°" + IntToStr(GetLastError())).c_str(),"Erreur d'ouverture",MB_OK);
           return (INVALID_HANDLE_VALUE);
        }
     
    // Change the ReadIntervalTimeout so that
    // ReadFile will return immediately. See
    // help file
        timeouts.ReadIntervalTimeout = MAXDWORD;
        timeouts.ReadTotalTimeoutMultiplier = 0;
        timeouts.ReadTotalTimeoutConstant = 0;
        timeouts.WriteTotalTimeoutMultiplier = 0;
        timeouts.WriteTotalTimeoutConstant = 0;
        SetCommTimeouts( comHandle, &timeouts );
     
    // Set the Data Terminal Ready line
        EscapeCommFunction(comHandle, SETDTR);
        PurgeComm(comHandle, PURGE_RXCLEAR);
        PortOpen = true;
        return comHandle;
      }
      return INVALID_HANDLE_VALUE;
    }
    //---------------------------------------------------------------------------
    void __fastcall TThreadCOM::Execute()
    {
       DWORD Count;
       char Str[1024];
       bool error;
     
       /* initialisation of DCB*/
       PortOpen  = false;
       EndThread = false;
     
       while (!EndThread)
       {
          Sleep(1); //évite d'occuper l'UC à 100%
     
          if(PortOpen && ReadFile(comHandle, Str, 1024, &Count, 0))
          {
              //if(Count > 0)
              {
                  Form1->Memo1->Lines->Add(IntToStr((int)Count) + " octets reçus");
                  for(int i=0;i<(int)Count;i++)
                      Form1->Memo1->Lines->Add("Octet reçu: " + IntToStr((int)Str[i]&255));
                  Form1->Memo1->Lines->Add("");
              }
          }
          else if(!error)
          {
              ShowMessage("Erreur de lecture");
              error = true;
          }
       }
    }
    //---------------------------------------------------------------------------
    void __fastcall TThreadCOM::CloseCOM(void)
    {
        if(!EndThread)
        {
            EndThread = true;
            CloseComPort();
        }
    }
    //---------------------------------------------------------------------------
    boolean __fastcall TThreadCOM::CheckCOMAvailibility(AnsiString COMport)
    {
        COMport = "\\\\.\\" + COMport;
        if (OpenCheckComPort(COMport.c_str()) != INVALID_HANDLE_VALUE)
        {
                EscapeCommFunction(CheckHandle, CLRDTR);
    	    CloseHandle(CheckHandle);
                return(true);
        }
        return(false);
    }
    //---------------------------------------------------------------------------
    void __fastcall TThreadCOM::StopCOM(void)
    {
        if(!EndThread && !Suspended)
            Suspend();
    }
    //---------------------------------------------------------------------------
    void __fastcall TThreadCOM::RestartCOM(void)
    {
        if(!EndThread && Suspended)
            Resume();
    }
    //---------------------------------------------------------------------------
    HANDLE __fastcall TThreadCOM::OpenCheckComPort(AnsiString COMport)
    {
      unsigned int comspeed = 4800;
     
    // Open the COM port
     
        COMport = "\\\\.\\" + COMport;
     
        CheckHandle = CreateFile(COMport.c_str(),
                               GENERIC_READ|GENERIC_WRITE,
                               0,
                               0,
                               OPEN_EXISTING,
                               FILE_ATTRIBUTE_NORMAL,
                               0);
     
     
        if (CheckHandle == INVALID_HANDLE_VALUE)
           return (INVALID_HANDLE_VALUE);
     
    // Get the current settings of the COMM port
        success = GetCommState(CheckHandle, &dcb);
        if (!success)
           return (INVALID_HANDLE_VALUE);
     
    // Modify the baud rate, etc.
        dcb.BaudRate      = comspeed;
        dcb.ByteSize      = 8;
        dcb.Parity        = NOPARITY;
        dcb.StopBits      = ONESTOPBIT;
        dcb.fOutxCtsFlow  = FALSE;
        dcb.fOutxDsrFlow  = FALSE;
        dcb.fDtrControl   = DTR_CONTROL_DISABLE;
        dcb.fRtsControl   = RTS_CONTROL_DISABLE;
        dcb.fAbortOnError = 0;
     
    // Apply the new comm port settings
        success = SetCommState(CheckHandle, &dcb);
        if (!success)
        {
           Application->MessageBox(AnsiString("Erreur Windows n°" + IntToStr(GetLastError())).c_str(),"Erreur d'ouverture",MB_OK);
           return (INVALID_HANDLE_VALUE);
        }
     
    // Change the ReadIntervalTimeout so that
    // ReadFile will return immediately. See
    // help file
        timeouts.ReadIntervalTimeout = MAXDWORD;
        timeouts.ReadTotalTimeoutMultiplier = 0;
        timeouts.ReadTotalTimeoutConstant = 0;
        timeouts.WriteTotalTimeoutMultiplier = 0;
        timeouts.WriteTotalTimeoutConstant = 0;
        SetCommTimeouts( CheckHandle, &timeouts );
     
    // Set the Data Terminal Ready line
        EscapeCommFunction(CheckHandle, SETDTR);
        PurgeComm(CheckHandle, PURGE_RXCLEAR);
        PortOpen = true;
        return CheckHandle;
    }
    //---------------------------------------------------------------------------
    dans le .h
    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
     
    //---------------------------------------------------------------------------
    class TThreadCOM : public TThread
    {
    private:
    protected:
            void __fastcall Execute();
            void   __fastcall CloseComPort(void);
            HANDLE __fastcall OpenCheckComPort(AnsiString COMport);
            HANDLE comHandle;
            HANDLE CheckHandle;
            bool   PortOpen;
            COMMTIMEOUTS timeouts;
            boolean success;
     
    public:
                    __fastcall TThreadCOM(bool CreateSuspended);
            HANDLE  __fastcall OpenComPort(AnsiString COMport, unsigned int comspeed);
            void    __fastcall CloseCOM(void);
            boolean __fastcall CheckCOMAvailibility(AnsiString COMport);
            void    __fastcall StopCOM(void);
            void    __fastcall RestartCOM(void);
            bool    __fastcall WriteComPort(AnsiString msg);
     
     
            DCB dcb;
            bool EndThread;
    };
    //---------------------------------------------------------------------------
    exemple d'utilisation:
    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
     
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
        //créer le thread
        MonThread = new TThreadCOM(false);
    }
    //---------------------------------------------------------------------------   
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
        //ouvre le port COM1
        MonThread->OpenComPort("COM1",CBR_57600);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        //ferme le port
        MonThread->CloseCOM();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
        //stop temporairement le port COM (fige le thread de comm)
        MonThread->StopCOM();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
        //relance le thread après stop temporaire
        MonThread->RestartCOM();
    }
    //---------------------------------------------------------------------------
    il te faudra un thread par port COM. Tous te permettront de tester n'importe quel port, mais une fois ouvert, ils sont attribués à un port. Une fois fermé, le thread se termine, il faudra donc en relancer un autre (d'où une fermeture temporaire si besoin).

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 30
    Par défaut
    Salut et désolé pour le retard de cette réponse

    j'ai essayer de lancer mon logiciel utilisant le TPortCom sur le com 2 puis de lancer le logiciel habituel sur le com 1 et ça m'as fait planté le 2ème logiciel

    je vais essayé cette methode avec l'API Windows d'ici la fin de la journée pour voir et je vous tien au courant pour d'éventuelles manques ou problèmes

    merci
    a+

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 30
    Par défaut
    Salut à tous
    Bandi Boy

    j'ai essayé ton code et après un peut d'adaptation à mon programme, ça marche.
    il me manque juste une chose
    j'ai déclarer "MonThread" comme étant un AnsiString et ça n'as pas l'air de marcher
    ne temps que quoi dois-je la déclarée?

    merci
    A+
    tibo

  18. #18
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Oups, excuse moi, j'avais oublié ce petit détail. Je l'avais déclaré dans mon .h de mon appli que je n'ai pas donné, dsl.
    Le thread est un élément de la class TThread, il faut donc le déclaré comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TThreadCOM *MonThread;
    Ca devrait mieux fonctionner.

  19. #19
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Par défaut
    Pour ceux que cela intéresse, j'ai aussi trouvé ça sur le site ressources Codegear, (main non testé).
    Fichiers attachés Fichiers attachés

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 30
    Par défaut
    en effet ça marche mieu... mais pas totalement
    lorsque je clique sur connecter ça me fait defiler une ligne "0 octet reçus" aussi rappidement que le peut le pauvre petit pentium 2 sur lequel je fait tourner l'application.
    je suppose que celà vient du fait que je n'ai pas gérer les "pause" comme tu l'avais dis.

    ensuite lorsque je lance une trame sur le port série, j'obtien un "224 octet reçus"

    c'est donc qu'à priori le programme reçoi ce que j'ai à lui envoyer

    maintenant ce qu'il me faudrai c'est que mon programme récupere cette trame sous la forme d'une variable que je puisse ensuite exploiter comme je le fait avec le tportcom.

    aurais-tu un exemple?
    merci
    tibo

Discussions similaires

  1. Write puis read sur port com
    Par chourmo dans le forum API, COM et SDKs
    Réponses: 34
    Dernier message: 21/06/2005, 17h36
  2. Problème de reception sur Port COM
    Par Revan777 dans le forum C
    Réponses: 9
    Dernier message: 19/04/2005, 21h55
  3. Qui vient sur developpez.com ?
    Par chess dans le forum Evolutions du club
    Réponses: 29
    Dernier message: 11/09/2004, 13h31

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