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 :

realiser un automate avec C++Builder devant communiquer avec une base de donnée


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 realiser un automate avec C++Builder devant communiquer avec une base de donnée
    Bonjour à tous!
    je suis débutant en C++builder et je travaille sur mon projet de fin d'étude qui porte sur la mise sur pied d'une interface borland qui doit recuperer une donnée dans une table d'une base de donnée Mysql et l'afficher dans un Edit,puis l'écrire sur le port serie.
    Puis attendre la réponse par lecture du même port série,ensuite l'afficher dans un autre Edit ensuite inserrer la donnée de cette réponse dans une autre table de la même base de donnée Mysql.
    NB:tout ce fonctionnement doit s'executer après chaque 2secondes, je voulais utiliser un timer pour çà. Je suis à cours d'idée et voici où je me trouve avec mon code source. jusqu'ici ce code recupere bien la donnée et l'affiche, mais une seule fois.S'il vous plaît aider moi.

    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
    Unit1.cpp
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "CPortCtl"
    #pragma link "CPort"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Timer1->Enabled=true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    Timer1->Enabled=false;
    }
    //---------------------------------------------------------------------------
     
     
     
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    // déclarations de nos variables
     
    AnsiString pass;
     
    // On remonte d'une ligne sur notre table
     
    Table1->Last();
     
     
     
    // On récupère la valeur de chaque colonne
     
    pass = Table1->FieldByName("pass")->AsString;
     
     
    // On affiche ces valeurs dans les zones de texte
     
    Edit1->Text = pass;
     
     
    } 
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count)
    {
    AnsiString Str;
    ComPort1->ReadStr(Str, Count);
    Edit2->Text=Str;
     
    }
    //---------------------------------------------------------------------------
     
     
    Unit1.h
    //---------------------------------------------------------------------------
     
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <DB.hpp>
    #include <DBTables.hpp>
    #include "CPortCtl.hpp"
    #include <ExtCtrls.hpp>
    #include "CPort.hpp"
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// IDE-managed Components
            TTable *Table1;
            TDatabase *Database1;
            TEdit *Edit1;
            TLabel *Label1;
            TLabel *Label2;
            TEdit *Edit2;
            TComLed *ComLed1;
            TComLed *ComLed2;
            TLabel *Label3;
            TLabel *Label4;
            TButton *Button1;
            TButton *Button2;
            TQuery *Query1;
            TDataSource *DataSource1;
            TTimer *Timer1;
            TComPort *ComPort1;
            void __fastcall Button1Click(TObject *Sender);
            void __fastcall Button2Click(TObject *Sender);
            //void __fastcall Timer1TimerTimer(TObject *Sender);
            void __fastcall Timer1Timer(TObject *Sender);
            void __fastcall ComPort1RxChar(TObject *Sender, int Count);
    private:	// User declarations
    public:		// User declarations
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif

  2. #2
    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
    1) utilise des listes pour l'affichage ce sera plus facile à suivre.
    2) tu dois faire une boucle sur le nombre d'enregistrement(R) de ta table "Table1->RecorCount, avec un First() et un Next() à chaque valeur de R.
    3) pour enregistret c'est pareil utiliste Edit() ou Append() et Post() à la fin

    Fait déja une lecture de tous tes enregistrement avec visualisation car lç avec un Last() tu te positionne au dernier record.

  3. #3
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Par défaut
    Merci Fbartolo,
    je vais essayer d'echanger avec vous selon l'ordre de vos suggestions parce que je suis débutant en C++Builder:
    1) utilise des listes pour l'affichage ce sera plus facile à suivre.
    je voudrais vous signaler que dans ce programme, une et une seule donnée doit être affichée.sourtout les données provenant de la base de donnée,donc un Edit me suffit

    2) tu dois faire une boucle sur le nombre d'enregistrement(R) de ta table "Table1->RecorCount, avec un First() et un Next() à chaque valeur de R.
    est ce que ce que vous me proposer ici me permettra d'actualiser l'affichage des données provenant de la base de donnée? parce que j'ai utilisé un timer pour actualiser l'affichage des données dans mon Edit apres chaque 2s, mais malheureusement cela ne s'affiche qu'une seule fois. POUVEZ VOUS ME PROPOSEZ UN CODE PERMETTANT A LA FONCTION TIMER DE S'EXECUTER APRES CHAQUE 2s?

    3) pour enregistret c'est pareil utiliste Edit() ou Append() et Post() à la fin Fait déja une lecture de tous tes enregistrement avec visualisation car lç avec un Last() tu te positionne au dernier record.
    Je dois recupérer uniquement la derniere donnée dans la table Password apres chaque 2s, c'est pour cela que jai utilisé un Last().

    Merci pour votre bonne compréhension

  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
    Ok, donc un procesus extérieur vient rajouter des données ou modifier la derniere ligne.
    De mémoire ton code est bon(je suis sur iPhone et je ne peut visualiser ton code)
    il te manque juste le rafraichissement de ton dataset ou table:
    soit par un requery, refresh ou plus simple :
    table1->active = false puis true
    j'utiliserais plus dans ton cas un query sql avec méthode Exec()
    la tu est sur de tout avoir au moment ou tu le demande(toutes les deux secondes dans ton timer

  5. #5
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Par défaut
    Merci beaucoup patron
    maintenant le timer fonctionne correctement mais, j'ai un autre problème: je n'arrive pas à pointer vers Edit1 pour récupérer la donnée presente et l'écrire directement sur le port série avec le composant Tcomport et je souhaite que ces données soit des chaines de caractère:pouvez vous m'aider avec un bout de code source?
    Merci d'avance

  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
    C'est du delphi, mais facilement transposable:
    http://nono40.developpez.com/tutorie...comport/#LIV-B

    sinon en BCB:
    http://petit.developpez.com/serie/cours_tcomport/

    tu as tout pour faire.

    bon courage.

  7. #7
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Par défaut
    Merci beaucoup Fbartolo,
    j'ai un problème avec l'événement OnRxChar,car je voudrais m'en servir pour lire les données présentes sur le port série et les afficher les unes après les autres dans Edit2 et ensuite pointer toujours sur la récente donnée affichée dans Edit2 et l'insérer dans une autre table Mysql.
    1-pouvez vous m'aidez avec un bout de code source?s'il vous plaît,je vous en pris chef
    2-est ce qu'il faut un autre TIMER pour ça? si oui comment l'intégrer dans le programme

  8. #8
    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
    le conseil que je te donne, c'est de faire un autre projet qui tournera sur un autre PC, avec un cable croisé de type Null Modem tu le connecte sur ton PC.

    l'autre programme lira par exemple un fichier texte et l'envera sur le port série, en boucle.
    de ton coté tu liras le contenu.

    dans la Documentation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count)
    { 
        unsigned char *Buf = new unsigned char [Count];
        ComPort1->Read(Buf, Count);
        //Lit "Count" octet(s) présent(s) dans le buffer d'entrée et le(s) place dans "Buf"
        delete [] Buf;
        Buf = NULL; 
    }
    int Count te donne le nombre de caractère mais tu peux ne rien faire dans cet évènement et le gérer toi même avec un test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        int NbrBits;
        if(ComPort1->InputCount()) 
            LecturePort(*Buffer);
    tu peux lire par des séquences Timer ou mettre des boucle Do - While, à toi de voir suivant ton prhramme général.

    fait de petit projet pour assimiler chaque fonctionnement, une fois intégré la technique tu pourra intégrer le projet principal.

    Je ne te poste pas d'exemple concret car en général il y a un protocole de com au niveau caractère avec des balise etc.. et là ça devient un peu plus complexe pour ce que tu veux faire...

  9. #9
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Par défaut
    Merci pour vos idées constructives,
    je suis un tout petit peu troublé à cause du temps qui m'ai imparti pour présenter ce projet.
    regardez le code source que j'avais posté au début et introduisez un timer ou une boucle do while pour qu'il puisse lire les données présentent au port série et l'afficher dans un Edit pour que je puisse l'inserrer dans une table Mysql chaque fois qu'il ya une nouvelle donnée presente dans le Edit s'il vous plait je suis débutant en borland.

  10. #10
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Par défaut
    Bonsoir Fbartolo
    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 (j'ai nommé borland) d'une base de donnée Mysql,ce n'et pas le cas pour le moment.
    Est ce quand recopiant le code contenu dans l'évènement OnRxChar dans une autre fonction timer2, 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

  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
    Oui dans ton cas tu dois lire toi même...
    car en mode sériel on introduit des caractères dits de protocole.

    Par exemple si tu veux envoyer des trame de messages, tes messages seront en cadrés par STX et ETX, ta phrase par EOT par exemple.

    Dans les propriété du composant tu as à paramétrer le caractère qui va déclancher l'évènement:
    - par exemple si tu veux lire une phrase complète qui se termine par EOT il fait que tu mettes EOT dans Buffer->EventChar = #04 (regarde ta table Ascii)

    Ton évènement prendra alors toute la phrase et te donnera la longueur de cette dernière.

    Pourquoi ne prends tu pas exemple sur la démo fournis avec le package depui sourceforge, il y à des exemple en C++ (Comport library exemple, il y a ton besoin couvert (sauf base de données)

  12. #12
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Par défaut
    Bonjour Fbartolo,
    je suis perdu, je vous est dit que j'etait debutant.
    j'ai quelques question à vous posez:
    1-est ce que utiliser le timer est une bonne méthode?parce que immaginez-vous qu'une donnée arrive sur le port lorsque le timer est inactif (comme il fonctionne par intervalle de temps ), est ce que cette donnée sera lu?
    Néanmoins je vous pris de modifier mon code précédent pour qu'il puisse fonctionner avec un timer patron car je suis vraiment débutant.
    2-comment je peux intégré le buffer dans mon code précédent (OU dans celui que vous allez me proposer) pour lire le port série? car je dois lire les données du genre: R0M, R5V, R2V...etc
    s'il vous plait aider moi



    j

  13. #13
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Par défaut
    Bonjour Fbartolo et lles membres du forum,
    je vous prie de faire quelques chose pour moi

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/04/2014, 10h50
  2. Réponses: 1
    Dernier message: 02/12/2012, 00h48
  3. Réponses: 2
    Dernier message: 17/10/2010, 21h48
  4. Builder C++ communique avec MS SQL 2005 EXPRESS
    Par anthonyBo dans le forum C++Builder
    Réponses: 0
    Dernier message: 08/07/2009, 16h56
  5. Réponses: 10
    Dernier message: 25/11/2007, 10h30

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