Probleme en Visual Basic 6

Bonjour,

Je suis en stage de 1ère année de BTS dans mon entreprise et je doit faire un programme qui va me permettre d'executer un relevé de mesure.
L'appareil qui va me permettre de faire cela est un Velleman pcsu10 recorder / K8047.

Mon programme est commencé mais je bloque à un droit.
L'endroit est le suivant c'est lorsque que je fait ma boucle infini.
Car ma boucle infini va me permettre de faire des relevés de la valeur mesurée estde la changé automatiquement.

Voici mon programme:
---------------------------------------------------------------------------------------------------------------------------------------------------------

Option Explicit

'Declare use of the DLL

'K8047D.DLL interface

'GENERAL PROCEDURES

Private Declare Sub StartDevice Lib "k8047d.dll" ()

Private Declare Sub StopDevice Lib "k8047d.dll" ()

Private Declare Sub Sleep Lib "kernel32" (ByValdwMilliseconds As Long)

'INPUT PROCEDURE

Private Declare Sub ReadData Lib "k8047d.dll" (Array_Pointer As Long)

'OUTPUT PROCEDURE

Private Declare Sub SetGain Lib "k8047d.dll" (ByVal Channel_no As Long, ByVal Gain As Long)

Private Declare Sub LEDon Lib "k8047d.dll" ()

Private Declare Sub LEDoff Lib "k8047d.dll" ()

'Declare variables

Dim DataBuffer(0 To 7) As Long

Private Sub Check1_Click()

If Check1.Value = 1 Then LEDon Else LEDoff

End Sub

Private Sub Form_Load()

StartDevice

End Sub

Private Sub Form_Terminate()

StopDevice

End Sub

Private Sub Command1_Click()

Dim i As Integer

Dim s As String

Dim date_heure As Integer

Dim date_mesure As String

Dim J As Integer

Do While Command1 = True

date_mesure = Date + Time

ReadData DataBuffer(0)

s = ""

For i = 0 To 5

s = s + Str(DataBuffer(i)) + Chr(9)

Next i

Text1.Text = s

Text2.Text = date_mesure

Sleep (2000)

Loop

End Sub

Private Sub Option1_Click(Index As Integer)

SetGain 1, Index

End Sub

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

Désolé pour le copier coller c'est mon premier forum.
Merci de prendre quelques minutes pour m'aider à résoudre mon problème.<code><gras>

14 réponses

Résumé de la discussion

Un stagiaire en BTS souhaite écrire un programme VB6 pour réaliser des relevés de mesure avec un Velleman K8047 et se bloque sur une boucle infinie produisant des résultats inattendus. Plusieurs participants évoquent des soucis de syntaxe et proposent des solutions comme Do While True et l’ajout d’un test de sortie dans la boucle, par exemple via ReadData et Command1. Des échanges demandent aussi de partager le code actuel pour clarifier la logique et évacuer les bugs; la discussion mentionne les DLL utilisées, notamment FastTime32 et K8047, comme éléments déterminants. En cas de progression, la solution proposée vise à tester une condition de fin et à autoriser la sortie de la boucle sans bloquer l’acquisition, afin d’obtenir des relevés fiables.

Bobot (l’IA à votre service)
  1. Contributeur Ambassadeur
    Que se passe-til exactement ? Qu'observe tu qui ne corresponde pas à tes attentes.
    0
    1. Merci de me répondre.
      Et bien lorsque je lance mon programme, mon logicielle visual basic plante et sa me met la fenêtre habituelle de windows avec terminé maintenant. Après il faut que je relance mon programme.

      Si j'enleve ma boucle mon programme fonctionne c'est avec ma boucle while que sa plante.

      j'espere avoir été assez clair.
      0
    2. Contributeur Ambassadeur
      @bichon-26que fais-tu pour enlever la boucle ? Tu gardes le code à l'intérieur, et tu supprimes simplement le do et le loop ?

      si, à la place du do, tu mets :
      ici:
      et à la place du loop,
      goto ici
      Que se passe-til ?

      Tu n'as aucune indication du type d'erreur ni de l'endroit où l'erreur se produit ?
      0
    3. Contributeur Ambassadeur
      @yg_betu pourrais aussi faire "do while true"
      0
    4. @yg_beoui c'est ce que je fais quand j'enleve le do et le loop mon programme tourne.

      j'ai essayer de faire ce que vous m'avez suggerer et cela fait pareil, sa me plante le logicielle, il ne réagi plus, je doit le fermé.
      0
    5. Contributeur Ambassadeur
      @bichon-26Suggestion : ajoute un msgbox après le sleep, pour voir après combien d'occurence cela se plante.
      0
  2. bonjour,

    le Do While Command1 = True ... Loop est une boucle inifini ... à aucun moment Command1 peut prendre la valeur False pour sortir de la boucle.

    ;o)
    0
    1. Bonjour,
      mais comment je peut faire pour lancer ma boucle alors ?
      0
      1. Eh bien c'est à toi de le définir ... je ne fais que te dire où est le problème.

        ;o)
        0
        1. Bonjour,

          dans la boucle, il faut une instruction de test de fin de lecture du genre :

          Sub TestBoucle()
          
              Dim objLecture As Variant
          
              Do While Command1 = True
                  date_mesure = Date + Time
                  ' Lecture
                  objLecture = ReadData DataBuffer(0)
                  ' Test de fin de lecture
                  If (objLecture  = "") Then
                      Command1 = False
                  End If
                  s = ""
                  For i = 0 To 5
                      s = s + Str(DataBuffer(i)) + Chr(9)
                  Next i
                  Text1.Text = s
                  Text2.Text = date_mesure
                  Sleep (2000)
              Loop
          
          End Sub
          

          '

          Lupin
          0
          1. sa me met erreur de syntaxe a
            objLecture = ReadData DataBuffer(0)
            0
            1. re :

              évidament, ce n'était qu'un exemple,
              je ne connais pas la DLL que tu utilise,
              même moi sous VBE il me signale que la ligne

              ReadData DataBuffer(0)

              est inconnu !

              Il te faut trouver la bonne syntaxe selon l'instructuion qui
              me semble venir d'une DLL externe.

              ' Test de fin de lecture
              If (ReadData DataBuffer(0) = "") Then
              Command1 = False
              End If

              L'instruction [ ReadData ] est inconnu sous VBA ainsi que la variable [ DataBuffer(0) ].

              La variable est facilement déclarable :

              Dim DataBuffer(6) As Variant

              mais l'instruction [ ReadData ] doit provenir d'une DLL. Il te faut
              savoir comment l'utiliser pour connaître la fin de la lecture par un
              test conditionnel qui terminera la boucle [ While ].

              Lupin
              0
              1. j'utilise un velleman k8047, c'est un appareil qui fait comme un oscilloscope mé sur le pc.

                je vais essayer vôtre solution, avec mes DLL, qui sont les suivant FastTime32 et K8047.

                je vous tient au courant
                0
            2. J'ai trouvé une autre solution la voici sa plante toujours mais j'ai quand même avancer:

              Do While Command1 = True

              date_mesure = Date + Time

              ici : ReadData DataBuffer(0)
              If DataBuffer(0) = 0 Then
              Sleep (1000)
              else

              s = ""

              For i = 0 To 5

              s = s + Str(DataBuffer(i)) + Chr(9)

              Next i

              Text1.Text = s

              Text2.Text = date_mesure

              Print toto
              Print s

              Loop

              End Sub

              voila maintenant avec cette modification sa me print toto et le resultat de s jusqu'a se que le logicielle rebug, c'est à dire environ 2 seconde apres le lancement du programme
              0
              1. Contributeur Ambassadeur
                bizarre ce if sans endif...
                0
              2. @yg_benon escuse moi je l'ai oublié quand j'ai recopié, j'ai bien un end if.
                0
            3. re :

              re :

              il n'y a toujours pas de test de fin pour initialiser Command1 a False dans la boucle

              Do While
              ...
              Loop

              il te faut un test du genre :

              If (ReadData DataBuffer(0) = 0) Then
              Command1 = False
              End If

              Lupin
              0
              1. sa fait toujours le problème, désolé
                0
                1. Contributeur Ambassadeur
                  Peux-tu ajouter des print avant et après le readdata, pour verifier que c'est le readdata qui plante ton programme ?
                  0
                  1. c'est ce que j'ai fait et voici le resultat

                    Do While Command1 = True
                    print gt"1"
                    date_mesure = Date + Time
                    print gt"2"
                    ici : ReadData DataBuffer(0)
                    print gt"3"
                    If DataBuffer(0) = 0 Then
                    print gt"4"
                    Sleep (1000)
                    else

                    je vois le gt 1 ,gt2 et gt3.
                    je ne voi pas le gt4

                    Bon je suis désolé il faut ke je rende le pc il é bientot 17h, je vais cherché se soir, merci beaucoup,
                    si vous ete ici demain alors a demain, on continuera.
                    bonne soirée
                    0
                    1. Contributeur Ambassadeur

                      Tu veux dire que le programme se plante après le gt3, sans faire print toto ?
                      0
                    2. @yg_beoui voila c'est ça
                      0
                  2. Contributeur Ambassadeur
                    Je suggére de remettre databuffer à zero avant d'appeller readdata, par exemple dans la boucle for i = 0 to 5.
                    Et de mettre un sleep aussi avant l'instruction loop. Peut-être que readdata n'aime pas être appellè trop fréquement ?
                    Tu peux montrer le code tel qu'il est maintenant ?
                    0
                    1. je ne peut pas mettre databuffer à 0 il ne veut pas.

                      En revanche j'ai fai un nouveau programme sans bouton, et j'arrive a faire une boucle avec for jusqu'a 100, par contre pour 1000 sa plante.
                      0
                    2. Contributeur Ambassadeur
                      @bichon-26databuffer(i)=0 pour chaque i.
                      0
                    3. @yg_beah non pardon escuse moi, je suis debutant et j'avez oublié de mettre le (i) de databuffer(i),
                      j'ai le regret de vous dire que sa plante toujours.
                      0
                    4. Contributeur Ambassadeur
                      @bichon-26Tu peux montrer le code tel qu'il est maintenant ?
                      0
                  3. voila le nouveau code

                    Option Explicit

                    'Declare use of the DLL

                    'K8047D.DLL interface

                    'GENERAL PROCEDURES

                    Private Declare Sub StartDevice Lib "k8047d.dll" ()

                    Private Declare Sub StopDevice Lib "k8047d.dll" ()

                    Private Declare Sub Sleep Lib "kernel32" (ByValdwMilliseconds As Long)

                    'INPUT PROCEDURE

                    Private Declare Sub ReadData Lib "k8047d.dll" (Array_Pointer As Long)

                    'OUTPUT PROCEDURE

                    Private Declare Sub SetGain Lib "k8047d.dll" (ByVal Channel_no As Long, ByVal Gain As Long)

                    Private Declare Sub LEDon Lib "k8047d.dll" ()

                    Private Declare Sub LEDoff Lib "k8047d.dll" ()

                    'Declare variables

                    Dim DataBuffer(0 To 7) As Long

                    Private Sub Check1_Click()

                    If Check1.Value = 1 Then LEDon Else LEDoff

                    End Sub

                    Private Sub Command2_Click()

                    If Command2 = True Then

                    Text1.Text = 0

                    Text3.Text = 0

                    End If

                    End Sub

                    Private Sub Command3_Click()

                    End

                    End Sub

                    Private Sub Form_Load()

                    StartDevice

                    End Sub

                    Private Sub Form_Terminate()

                    StopDevice

                    End Sub

                    Private Sub Command1_Click()

                    Dim i As Integer

                    Dim s As String

                    Dim date_heure As Integer

                    Dim date_mesure As String

                    Dim J As Integer

                    Dim reply As Integer

                    J = 0

                    Do Until J = 100

                    aqui (J)

                    'Do While Command1 = True

                    date_mesure = Date + Time

                    ici: ReadData DataBuffer(0)

                    'If DataBuffer(0) = 0 Then

                    'Command1 = False

                    'Sleep (30)

                    'GoTo ici

                    'Else

                    ' s = ""

                    'For i = 0 To 5

                    ' s = s + Str(DataBuffer(2)) '+ Chr(9)

                    'Next i

                    ' End If

                    For i = 1 To 1000

                    Next i

                    J = J + 1

                    Text1.Text = s

                    Text2.Text = date_mesure

                    'Sleep (2000)

                    'Loop

                    Dim delta As Integer

                    Dim ValMax As Integer

                    Dim ValMin As Integer

                    Dim ValMoy As Integer

                    If DataBuffer(2) > ValMax Then

                    ValMax = ValMax + DataBuffer(2)

                    Text6.Text = date_mesure

                    Text3.Text = ValMax

                    End If

                    Loop

                    End Sub

                    Private Sub Option1_Click(Index As Integer)

                    SetGain 1, Index

                    End Sub

                    Sub aqui(J)

                    Dim s As String

                    Dim i As Integer

                    ReadData DataBuffer(0)

                    s = ""

                    For i = 0 To 5

                    s = s + Str(DataBuffer(2)) '+ Chr(9)

                    Next i

                    Text1.Text = s

                    Print s

                    ' End If

                    End Sub

                    comme tu peut le voir j'ai apelé une autre fonction, ou à l'intérieur de cette fonction il y a ma boucle, c'est assez barbare.
                    0