Probleme en Visual Basic 6

bichon-26 Messages postés 7 Statut Membre -  
 bichon-26 -
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

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    Que se passe-til exactement ? Qu'observe tu qui ne corresponde pas à tes attentes.
    0
    1. bichon-26
       
      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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > bichon-26
       
      que 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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      tu pourrais aussi faire "do while true"
      0
    4. bichon-26 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      oui 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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > bichon-26
       
      Suggestion : ajoute un msgbox après le sleep, pour voir après combien d'occurence cela se plante.
      0
  2. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
  3. bichon-26
     
    Bonjour,
    mais comment je peut faire pour lancer ma boucle alors ?
    0
  4. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Eh bien c'est à toi de le définir ... je ne fais que te dire où est le problème.

    ;o)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    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
  7. bichon-26
     
    sa me met erreur de syntaxe a
    objLecture = ReadData DataBuffer(0)
    0
  8. Utilisateur anonyme
     
    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. bichon-26
       
      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
  9. bichon-26
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      bizarre ce if sans endif...
      0
      1. bichon-26 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        non escuse moi je l'ai oublié quand j'ai recopié, j'ai bien un end if.
        0
  10. Utilisateur anonyme
     
    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
  11. bichon-26
     
    sa fait toujours le problème, désolé
    0
  12. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    Peux-tu ajouter des print avant et après le readdata, pour verifier que c'est le readdata qui plante ton programme ?
    0
  13. bichon-26
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      Tu veux dire que le programme se plante après le gt3, sans faire print toto ?
      0
      1. bichon-26 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        oui voila c'est ça
        0
  14. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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. bichon-26
       
      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
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > bichon-26
         
        databuffer(i)=0 pour chaque i.
        0
      2. bichon-26 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        ah 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
      3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > bichon-26
         
        Tu peux montrer le code tel qu'il est maintenant ?
        0
  15. bichon-26
     
    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