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
    Que se passe-til exactement ? Qu'observe tu qui ne corresponde pas à tes attentes.
    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.
    2. Contributeur
      @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 ?
    3. Contributeur
      @yg_betu pourrais aussi faire "do while true"
    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é.
    5. Contributeur
      @bichon-26Suggestion : ajoute un msgbox après le sleep, pour voir après combien d'occurence cela se plante.
  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)
    1. Eh bien c'est à toi de le définir ... je ne fais que te dire où est le problème.

      ;o)
      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
        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
          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
        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
          1. Contributeur
            bizarre ce if sans endif...
          2. @yg_benon escuse moi je l'ai oublié quand j'ai recopié, j'ai bien un end if.
        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
          1. Contributeur
            Peux-tu ajouter des print avant et après le readdata, pour verifier que c'est le readdata qui plante ton programme ?
            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
              1. Contributeur

                Tu veux dire que le programme se plante après le gt3, sans faire print toto ?
            2. Contributeur
              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 ?
              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.
              2. @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.
              3. Contributeur
                @bichon-26Tu peux montrer le code tel qu'il est maintenant ?
            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.