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 :

Carte Velleman VM110N - Chenillard


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Carte Velleman VM110N - Chenillard
    Salut, je voudrais savoir que faire pour ajouter un stop fonctionnel pour arrêter une séquence chenillard en cours et aussi si il existe de faire plus simple et plus propre que les sleeps, j'ai pensais aux timers mais je ne vois pas du tout comment faire... Voilà mon 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
    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
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
    #include <stdio.h>
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    int ChoixFrequence=200;
    int Nbr=1;
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    char texte[20];
    int CardAddr = 3 - (int(SK5->Checked) + int(SK6->Checked) * 2);
    unsigned long numCarteConnectee=a.ConnectionCarte(CardAddr);
    switch (numCarteConnectee)
    	{
    	  case  0 :
    	  case  1 :
    	  case  2 :
    	  case  3 :
    		sprintf (texte, " Carte %u connctée" ,CardAddr);
    		LEtatConnexion->Caption = texte;
    		LEtatConnexion->Caption = "Carte " + IntToStr(CardAddr) + " connectée";
     
    		LEtatConnexion->Font->Color = clBlack;
     
     
    		break;
    	   case  -1 :
    		 LEtatConnexion->Caption = "Carte " + IntToStr(CardAddr) + " introuvable";
    		 LEtatConnexion->Font->Color=clBlack;
     
    	}
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    int y;
     
     for (y=0;y<Nbr;y++)
     {
    	a.AppliqueSequence(1);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0x3);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0x2);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0x6);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(4);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(12);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(8);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(24);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(16);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(48);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(32);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(96);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(64);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(192);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(128);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0);
       }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
    ChoixFrequence=EFrequence->Text.ToInt();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    int y;
     
     for (y=0;y<Nbr;y++)
     {
    	a.AppliqueSequence(24);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(16);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(48);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(32);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(96);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(64);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(192);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(128);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0);
     }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
    int i;
     for (i=0;i<Nbr;i++)
     {
    	a.AppliqueSequence(1);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(2);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(4);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0x8);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(16);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(32);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(64);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0x80);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0);
     
     }
     
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button6Click(TObject *Sender)
    {
    Nbr=ENbr->Text.ToInt();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    	bool i;
    	i=a.LireSequenceB(1) ;
    	CH2->Checked=i;
    	if (CH2->Checked==true)
    	{
    	a.AppliqueSequence(1);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(2);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(4);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0x8);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(16);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(32);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(64);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0x80);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0);
    	}
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button7Click(TObject *Sender)
    {
     
    }
    //---------------------------------------------------------------------------
    En vous remerciant d'avance !

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Quand je voie cela :
    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
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    int y;
     
     for (y=0;y<Nbr;y++)
     {
    	a.AppliqueSequence(1);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0x3);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0x2);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0x6);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(4);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(12);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(8);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(24);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(16);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(48);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(32);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(96);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(64);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(192);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(128);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0);
       }
    }
    Je me dis que cela pourrait être remplacé par cela :
    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
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    int y;
    int seq;
    static int tbl_sequence[] = { 1, 0x3, 0x2, 0x6, 4, 12, 8, 24, 16, 48, 32, 96, 64, 192, 128, 0 };
     
     for (y=0;y<Nbr;y++)
     {
          for(seq = 0, seq != sizeof(tbl_sequence) / sizeof(tbl_sequence[0]); seq++)
          {
    	a.AppliqueSequence(tbl_sequence[seq]);
    	Sleep(ChoixFrequence);
          }
       }
    }
    Et pareil dans d'autres parties. C'est plus lisible et surtout plus évolutif.

    A ce propos, pourquoi avoir mis des nombre en hexa (0x6) et en décimal ? Il y a une raison ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Quand je voie cela :
    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
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    int y;
     
     for (y=0;y<Nbr;y++)
     {
    	a.AppliqueSequence(1);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0x3);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0x2);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0x6);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(4);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(12);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(8);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(24);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(16);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(48);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(32);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(96);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(64);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(192);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(128);
    	Sleep(ChoixFrequence);
    	a.AppliqueSequence(0);
       }
    }
    Je me dis que cela pourrait être remplacé par cela :
    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
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    int y;
    int seq;
    static int tbl_sequence[] = { 1, 0x3, 0x2, 0x6, 4, 12, 8, 24, 16, 48, 32, 96, 64, 192, 128, 0 };
     
     for (y=0;y<Nbr;y++)
     {
          for(seq = 0, seq != sizeof(tbl_sequence) / sizeof(tbl_sequence[0]); seq++)
          {
    	a.AppliqueSequence(tbl_sequence[seq]);
    	Sleep(ChoixFrequence);
          }
       }
    }
    Et pareil dans d'autres parties. C'est plus lisible et surtout plus évolutif.

    A ce propos, pourquoi avoir mis des nombre en hexa (0x6) et en décimal ? Il y a une raison ?
    J'ai rajouté le ; manquant après le seq ++ mais ça ne fonctionne pas, ceci dit effectivement c'est plus évolutif mais je suis en 1ère Année de BTS et je t'avouerais que c'est des fonctions qui me sont totalement inconnue ^^

    Je tiens à ajouter que en plus lorsque je lance une séquence je ne peux plus cliquer nul part et avoir action sur quoi que ce soit tant que la boucle n'est pas finie...

    En ce qui concerne les nb en hexa c'est une erreur de ma part x)

    Merci en tout cas de tenter de m'aider ^^

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Kylvan Voir le message
    J'ai rajouté le ; manquant après le seq ++ mais ça ne fonctionne pas
    Il n'y en avait pas besoin, c'est pour cela que je ne l'avais pas mis (je pense même que le mettre est une erreur, montre le code).


    Citation Envoyé par Kylvan Voir le message
    ...mais je suis en 1ère Année de BTS et je t'avouerais que c'est des fonctions qui me sont totalement inconnue ^^
    Pas de problème, on a tous débuté un jour ou l'autre et c'est en voyant le code des autres que l'on progresse.

    Citation Envoyé par Kylvan Voir le message
    Je tiens à ajouter que en plus lorsque je lance une séquence je ne peux plus cliquer nul part et avoir action sur quoi que ce soit tant que la boucle n'est pas finie...
    OK, je pense que je commence à comprendre ton problème : tu as une application graphique qui envoie des commande vers un chenillard et cette application graphique est figée tant que l'ensemble des commandes n'est pas terminé.

    Le problème provient du fait que tu ne rend pas la main à l'application graphique tant que ton action n'est pas finie.

    Pour rendre la main, il va falloir que ton action se déroule dans un thread différent.

    L'idée, c'est :
    • L'utilisateur clique sur un bouton
    • l'action du bouton est de lancer un thread avec en paramètre les actions que tu veux réaliser sur ton chenillard
    • Une fois que le thread est lancé, c'est fini, l'application redevient active (moins d'1/2 seconde).

    Pendant ce temps, le thread vit tranquillement sa vie, il envoie les commandes au chenillard et quand il a fini, il se termine.

    Avec une architecture comme cela, tu vas pouvoir implémenter un bouton "stop" qui pourra interrompre le thread en cours.

    Mais avant cela, tu as plusieurs difficultés à résoudre :
    • comprendre les thread, comment cela marche
    • si tu quittes ton appli et qu'un thread est lancé, il faut le terminer sinon, risque de crash
    • il ne faut pas que tu puisse lancer plusieurs thread simultanément sinon, ton chenillard va ressemble à n'importe quoi
    • il faut que tu trouves un moyen pour indiquer au thread les commandes que tu veux lui faire exécuter
    • il faut aussi que ton thread informe ton application qu'il a terminé



    Donc au travail, commence avec les threads.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Il n'y en avait pas besoin, c'est pour cela que je ne l'avais pas mis (je pense même que le mettre est une erreur, montre le code).



    Pas de problème, on a tous débuté un jour ou l'autre et c'est en voyant le code des autres que l'on progresse.



    OK, je pense que je commence à comprendre ton problème : tu as une application graphique qui envoie des commande vers un chenillard et cette application graphique est figée tant que l'ensemble des commandes n'est pas terminé.

    Le problème provient du fait que tu ne rend pas la main à l'application graphique tant que ton action n'est pas finie.

    Pour rendre la main, il va falloir que ton action se déroule dans un thread différent.

    L'idée, c'est :
    • L'utilisateur clique sur un bouton
    • l'action du bouton est de lancer un thread avec en paramètre les actions que tu veux réaliser sur ton chenillard
    • Une fois que le thread est lancé, c'est fini, l'application redevient active (moins d'1/2 seconde).

    Pendant ce temps, le thread vit tranquillement sa vie, il envoie les commandes au chenillard et quand il a fini, il se termine.

    Avec une architecture comme cela, tu vas pouvoir implémenter un bouton "stop" qui pourra interrompre le thread en cours.

    Mais avant cela, tu as plusieurs difficultés à résoudre :
    • comprendre les thread, comment cela marche
    • si tu quittes ton appli et qu'un thread est lancé, il faut le terminer sinon, risque de crash
    • il ne faut pas que tu puisse lancer plusieurs thread simultanément sinon, ton chenillard va ressemble à n'importe quoi
    • il faut que tu trouves un moyen pour indiquer au thread les commandes que tu veux lui faire exécuter
    • il faut aussi que ton thread informe ton application qu'il a terminé



    Donc au travail, commence avec les threads.
    Merci pour tes réponses ! Cependant lorsque je ne m'étais pas le ; manquant ça me mettait que c'était manquant et lorsque je le met je n'ai pas d'erreur, seulement, le truc c'est que lorsque j'entre la fréquence dans mon edit box ça et que je valide, lorsque je lance la séquence, rien ne se passe.

    Et c'est exact en ce qui concerne le thread

Discussions similaires

  1. Carte Velleman K8000
    Par captainbiceps dans le forum Programmation système
    Réponses: 0
    Dernier message: 16/07/2013, 16h44
  2. Delphi et la carte Velleman K8061
    Par Seymour.Papert dans le forum Langage
    Réponses: 1
    Dernier message: 11/02/2010, 22h59
  3. Projet Stage Carte Pic / Velleman
    Par Djaiii dans le forum Automation
    Réponses: 0
    Dernier message: 15/04/2008, 09h31
  4. Réponses: 6
    Dernier message: 09/04/2007, 16h52
  5. Accès au port 700h pour une carte d'interface
    Par haypo dans le forum Matériel
    Réponses: 3
    Dernier message: 07/11/2002, 11h30

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