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 :

Communication d'une application en C++bulder avec le port série et la base de données


Sujet :

C++Builder

  1. #1
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Par défaut Communication d'une application en C++bulder avec le port série et la base de données
    Salut à tous!
    Je vouvrais concevoir un programme en C++bulder qui tourne en permanence et recupère le caractère présent sur le port série ensuite l'écrit dans une base de données Mysql.
    Ce même programme en C++bulder doit également tourner en permanence et recupèrer un autre caractère présent dans la base de données et l'écrire sur le port série.
    S'il vous plait aider moi pour mes codes en C++Bulder.

  2. #2
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    Bonjour,

    Jettes un coup d'œil sur les cours et tutoriels du site, tu trouveras ton bonheur pour l'utilisation du port série.


    Pour ce qui de la gestion de la base de donnée, je te conseil de faire une recherche sur le forum, le sujet a été posé maintes fois.

    Commence ensuite à programmer, et quand tu as des difficultés on est là pour t'aider.

    Bon courage

  3. #3
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Par défaut
    Bonsoir kmaniche
    J'etais malade depuis et ça va pour le moment.
    j'ai un tout petit peu avancer dans les recherches et les tests que vous m'avez demandez de faire.Mais seulement je me suis rendu compte que l'évènement OnRxChar ne reagit pas comme je souhaitai.
    En effet il devait lire le port serie chaque fois qu'une donnée est présente sur ce port et lafficher dans Edit 2 et cette donnée devait être inserer immediatement dans la table (je l'ai nommé borland) d'une base de donnée Mysql,ce n'et pas le cas pour le moment.
    j'ai lu le tutoriel de vincent petit sur Tcomport,mais je ne comprend pas bien le fonctionnement l'évènement OnRxChar car je dois lire les données du genre R0M , R6V , R3A ...provenant d'un microcontroleur PIC16F877

    Est ce quand recopiant le code contenu dans l'évènement OnRxChar dans une fonction timer, je ne peux pas resoudre ce problème?
    Voici mon code source:

    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
    void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count)
    {
    AnsiString Str;
    ComPort1->ReadStr(Str, Count);
    Edit2->Text=Str;
     //Form1->Session1->Open();
    Form1->Database1->Open();
    Form1->Query1->SQL->Clear();
    Form1->Query1->SQL->Add("INSERT INTO borland(id_borland,infos) values('','"+Edit2->Text+"')");
    Form1->Query1->ExecSQL();
    Form1->Query1->Close();
    Form1->Database1->Close();
    //Form1->Session1->Close();
    // On reinitialise la table
     
    //Table2->Active = false;
     
    //Table2->Active = true;
    }
    S'il vous plait aider moi

  4. #4
    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 trouve que tu ne fais pas beaucoups d'effort (c'est ton 2eme post sur le sujet)... mais bon:

    Ce ne sont que des exemples de test !!, ce n'est pas la meilleure solution car n'utilise pas d'évènement mais une attente...

    Init du com:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
           if (Form1->ComPort1->Connected == true)
                Form1->ComPort1->Connected = false;
            Form1->ComPort1->BaudRate = VitessePort;    // à 9600 Bds au départ
            Form1->ComPort1->Parity->Bits = prEven;		// Parité paire
            Form1->ComPort1->Events = TComEvents(); /* clear tous les évenements */
            Form1->ComPort1->Connected = true;
    Attente de X caractères Y milisecondes (comme ça tu es sur d'avoir une trame en lecture ensuite:
    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
     
    int RxUevAtt(unsigned int MaxAtt, unsigned int NumCar)
        {
        unsigned int NbrBits=0;
        unsigned int Att = 0;
        MaxAtt /=10;  //division par 10
        //struct  time t;
        //struct  time tt;
        //gettime(&t);
     
        do  {
            NbrBits = Form1->ComPort1->InputCount();
            if (NbrBits < NumCar)
                {
                Sleep(10);     // 10 ms est la résolution max
                Application->ProcessMessages();  // afin de rafraichier l'écran..
                }
            Att++;
            }while ((Att< MaxAtt) && (NbrBits < NumCar));
     
      //gettime(&tt);
      //ShowMessage( IntToStr(t.ti_sec)  + ":" + IntToStr(t.ti_hund)+ "-" + IntToStr(tt.ti_sec)  + ":" + IntToStr(tt.ti_hund));
     
            if (Att < MaxAtt)
                return NbrBits; //OK Nb Bits
            else
                return 0; //pas de car dans le temps ERREUR
        }
    dans ton timer tu pourra mettre un truc du genre:
    Attention tempo timer à mettre à 1 seconde (pas trop court ne servirait à rien)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                  if  (RxUevAtt(5000, 4)== 0) //Attente de bloc DATA (4 caractères)
                                   return ERRORDATA; // erreur ou autre attente...
                  Form1->ComPort1->Read(Trep, 4);      // enregistrement
                  // puis sauvegarde dans ta base....

  5. #5
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Par défaut
    Bonsoir Fbartolo
    je continu de faire des recherches et les tests que vous m'avez sugéré.Mais seulement j'ai quelques questions à vous posez:

    1-lorsque je recupère mes données depuis ma base de données pour écrire sur le port série, cela n'est possible que si je teste d'abord le port série avec une autre application borland C++ que j'avais fait pour envoyer les données sur le port série, je ne comprend pas pourquoi?
    Voici le code:

    Edit1->Text = code;


    if(code=='a')
    {
    char tableau[1] = {'a'};
    ComPort1->Write(tableau, 1);
    }
    if(code=='b')
    {
    char tableau[1] = {'b'};
    ComPort1->Write(tableau, 1);
    }

    if(code=='R')
    {
    char tableau[1] = {'R'};
    ComPort1->Write(tableau, 1);
    }

    if(code=='c')
    {
    char tableau[1] = {'c'};
    ComPort1->Write(tableau, 1);
    }

    if(code=='d')
    {
    char tableau[1] = {'d'};
    ComPort1->Write(tableau, 1);
    }

    if(code=='N')
    {
    char tableau[1] = {'N'};
    ComPort1->Write(tableau, 1);
    }


    if(code=='e')
    {
    char tableau[1] = {'e'};
    ComPort1->Write(tableau, 1);
    }
    if(code=='1')
    {
    char tableau[1] = {'f'};
    ComPort1->Write(tableau, 1);
    }

    if(code=='2')
    {
    char tableau[1] = {'X'};
    ComPort1->Write(tableau, 1);
    }

    if(code=='g')
    {
    char tableau[1] = {'g'};
    ComPort1->Write(tableau, 1);
    }

    if(code=='h')
    {
    char tableau[1] = {'h'};
    ComPort1->Write(tableau, 1);
    }

    if(code=='I')
    {
    char tableau[1] = {'I'};
    ComPort1->Write(tableau, 1);
    }


    if(code=='i')
    {
    char tableau[1] = {'i'};
    ComPort1->Write(tableau, 1);
    }
    if(code=='j')
    {
    char tableau[1] = {'j'};
    ComPort1->Write(tableau, 1);
    }

    if(code=='A')
    {
    char tableau[1] = {'A'};
    ComPort1->Write(tableau, 1);
    }

    if(code=='k')
    {
    char tableau[1] = {'k'};
    ComPort1->Write(tableau, 1);
    }

    if(code=='l')
    {
    char tableau[1] = {'l'};
    ComPort1->Write(tableau, 1);
    }

    if(code=='B')
    {
    char tableau[1] = {'B'};
    ComPort1->Write(tableau, 1);
    }


    if(code=='m')
    {
    char tableau[1] = {'m'};
    ComPort1->Write(tableau, 1);
    }
    if(code=='n')
    {
    char tableau[1] = {'n'};
    ComPort1->Write(tableau, 1);
    }

    if(code=='F')
    {
    char tableau[1] = {'F'};
    ComPort1->Write(tableau, 1);
    }

    if(code=='o')
    {
    char tableau[1] = {'o'};
    ComPort1->Write(tableau, 1);
    }

    if(code=='p')
    {
    char tableau[1] = {'p'};
    ComPort1->Write(tableau, 1);
    }

    if(code=='G')
    {
    char tableau[1] = {'G'};
    ComPort1->Write(tableau, 1);
    }

    2-lorsque je met dans le même FORM mon code de lecture du port série cela crée des erreurs et je pensais que cela était dû au fait que dans mon programme le port était ouvert mode lecture et écriture au même moment. je ne sais pas comment contourner ce genre de problème.

    3-néanmoins j'ai écrit ce programme de lecture dans un deuxième FORM, et quand je veux faire fonctionner les 2 programmes au même moment comme le prévoit le projet ça me génère l'erreur à cause du fait que le port reste ouvert dans les 2 programmes .
    voici mon code:
    void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count)
    {
    AnsiString Str;
    ComPort1->ReadStr(Str, Count);
    Edit1->Text=Str;
    }

    et les données que je reçoient ne sont pas les caractère que j'attendais. Je précise que je n'ai obtenu ceci que lorsque le programme d'ecriture etait arrêtte.

  6. #6
    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 la première partie:
    un truc comme ça devrait marcher:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ComPort1->Write(Code.c_str(), Code.Lenght());
    Pour l'ouverture du port par deux processus, c'est pas possible !!

    je ne connais pas ta façon de faire, mais dans ce cas prépare un tableau IN et OUT qui sera alimenté par la lecture du port (IN), que tu viendra lire par évènement ou à ta guise.

    le OUT tu l'alimente et un timer par exemple vient voir si il y a QQ chose à envoyer...

    Tu fais des trucs très bizzare.

    Si les données reçues ne sont pas bonnes regarde ta parité et NB bits définies dans ton Init du port

    Les exemple sont pourtant très bien faits..

Discussions similaires

  1. Communication d'une application web J2EE avec une base de données
    Par wafabrj dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 23/05/2012, 16h45
  2. Réponses: 1
    Dernier message: 11/06/2007, 10h25
  3. Réponses: 9
    Dernier message: 13/09/2006, 14h19
  4. Réponses: 4
    Dernier message: 07/02/2005, 21h22

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