Probleme en Visual Basic 6
bichon-26
Messages postés
7
Statut
Membre
-
bichon-26 -
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>
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
-
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.-
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. -
-
-
-
-
-
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) -
-
Eh bien c'est à toi de le définir ... je ne fais que te dire où est le problème.
;o) -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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 -
-
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 -
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 -
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 -
-
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 ? -
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 -
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 ? -
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.