Probleme en Visual Basic 6

Fermé
bichon-26 Messages postés 7 Date d'inscription mercredi 18 juin 2008 Statut Membre Dernière intervention 15 décembre 2010 - 18 juin 2008 à 10:20
 bichon-26 - 19 juin 2008 à 13:58
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>
A voir également:

14 réponses

yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 Ambassadeur 1 539
18 juin 2008 à 11:06
Que se passe-til exactement ? Qu'observe tu qui ne corresponde pas à tes attentes.
0
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
yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 1 539 > bichon-26
18 juin 2008 à 11:38
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
yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 1 539 > yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024
18 juin 2008 à 11:48
tu pourrais aussi faire "do while true"
0
bichon-26 > yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024
18 juin 2008 à 12:45
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
yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 1 539 > bichon-26
18 juin 2008 à 13:18
Suggestion : ajoute un msgbox après le sleep, pour voir après combien d'occurence cela se plante.
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
18 juin 2008 à 11:17
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
Bonjour,
mais comment je peut faire pour lancer ma boucle alors ?
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
18 juin 2008 à 11:27
Eh bien c'est à toi de le définir ... je ne fais que te dire où est le problème.

;o)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
18 juin 2008 à 13:20
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
sa me met erreur de syntaxe a
objLecture = ReadData DataBuffer(0)
0
Utilisateur anonyme
18 juin 2008 à 14:06
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
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
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
yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 1 539
18 juin 2008 à 16:18
bizarre ce if sans endif...
0
bichon-26 > yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024
18 juin 2008 à 16:40
non escuse moi je l'ai oublié quand j'ai recopié, j'ai bien un end if.
0
Utilisateur anonyme
18 juin 2008 à 15:43
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
sa fait toujours le problème, désolé
0
yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 Ambassadeur 1 539
18 juin 2008 à 16:27
Peux-tu ajouter des print avant et après le readdata, pour verifier que c'est le readdata qui plante ton programme ?
0
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
yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 1 539
18 juin 2008 à 16:54

Tu veux dire que le programme se plante après le gt3, sans faire print toto ?
0
bichon-26 > yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024
18 juin 2008 à 21:35
oui voila c'est ça
0
yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 Ambassadeur 1 539
19 juin 2008 à 11:08
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
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
yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 1 539 > bichon-26
19 juin 2008 à 13:25
databuffer(i)=0 pour chaque i.
0
bichon-26 > yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024
19 juin 2008 à 13:30
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
yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 1 539 > bichon-26
19 juin 2008 à 13:36
Tu peux montrer le code tel qu'il est maintenant ?
0
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