Probléme avec DoEvents

lbch1974 Messages postés 7 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 26 janvier 2006 - 26 janv. 2006 à 11:02
perathoner Messages postés 90 Date d'inscription dimanche 5 novembre 2000 Statut Membre Dernière intervention 26 juillet 2006 - 26 janv. 2006 à 17:19
Salut
Merci d'avance pour vos aides. J'est réalisé un programme en visual basic 6.0 qui reçoit les données a travers le com1 et le com2 pour cela j'est travaillé avec la procédure d'évenement OnComm() du contrôle OnComm qui ce déclanche automatiquement des que le port série (Com1 ou Com2) reçoit des données. a l'intérieur de cette procédure j'est utilisé le syntaxe suivant :
Do
DoEvents
tampon_ptb220 = tampon_ptb220 & mscPTB220.Input
Loop Until InStr(tampon_ptb220, Chr$(13) & Chr$(10))
A l'execution du programme et aprés quelque minute il envoi le message d'erreur suivant "Erreur d'execution 28 espace de pile insuffisant"
et quand je fait le débogage il me signale que l'erreur et au niveau du syntaxe DoEvents . Sachant que lorsque je met DoEvents en commentaire le SE se plante.
Merci

14 réponses

econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
26 janv. 2006 à 11:11
C'est certainement ta variable tampon_ptb220 qui explose. Elle doit contenir trop d'éléments.

tampon_ptb220 prend trop de mémoire, et au moment où DoEvents la sollicite, c'est la goutte qui fait déborder le vase.

Mais ton problème doit bien se situer sur ta boucle Do ... Loop.

Soit elle ne s'arrête jamais, soit il y a trop d'input avant de recevoir le caractère de fin.

1ère possibilité à privilégier.






Manu
-------------------------------------------
Une question bien posée, c'est une chance de réponse bien adaptée.
0
perathoner Messages postés 90 Date d'inscription dimanche 5 novembre 2000 Statut Membre Dernière intervention 26 juillet 2006
26 janv. 2006 à 11:23
Hello.



Elle est de quel type ta variable tampon_ptb220 ???



Pourquoi ne met tu pas un tableau d'octets à la place ??? (ex : Dim toto() as Byte)



J'imagine que t'es données reçu sur des COM1 et COM2 ont un
protocole... ex protocole Modbus... donc t'es données sont
encapsulées... suivant une trame que toi tu décode par la suite..pour
que t'es données ais un sens. Donc en fonction de ton protocol tu
devrais faire n tableau d'octets ou d'autres chose !!! je ne connais
pas ton projet... à toi de voir..



@+
0
perathoner Messages postés 90 Date d'inscription dimanche 5 novembre 2000 Statut Membre Dernière intervention 26 juillet 2006
26 janv. 2006 à 11:31
Re..



Ou bien le pb vient du fait que ta boucle est infinie... c'est à dire que ta condition de stop n'arrive jamais...???

Moi perso j'ai eu plusieurs fois ce message et à chaque fois c't un pb de boucle infini...voilà.



@+
0
lbch1974 Messages postés 7 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 26 janvier 2006
26 janv. 2006 à 11:49
Merci
Mon variable tampon_ptb220 est de type string sachant qu' a l'execution du programme il ya récéption des données et le programme le traite et l'affiche dans un TextBox . Mais le message d'erreur se manifeste aprés quelque minute
0

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

Posez votre question
acecel Messages postés 140 Date d'inscription jeudi 6 mai 2004 Statut Membre Dernière intervention 14 octobre 2006
26 janv. 2006 à 12:06
Oui car la condition pour sortir de la boucle n'est jamais vérifiée, donc ta variable Tampon se remplit jusqu'à saturation.
De plus ta boucle fait appel sans cesse à la fonction .input de ta variable mscPTB220, et ce de manière asynchrone, c'est à dire qu'il n'attends pas que l'execution de cette fonction soit finie avant de continuer la procédure, et donc il l'appelle sans cesse, jusqu'à ce qu'il y ait trop d'appels dans la pile mémoire, et là ca plante.

Enfin je croit
0
perathoner Messages postés 90 Date d'inscription dimanche 5 novembre 2000 Statut Membre Dernière intervention 26 juillet 2006
26 janv. 2006 à 12:18
Re.



L'idée à mon sens, s'est qu'il faudrait que tu détermine une procédure
pour déterminer quand dois tu lire ton buffer de réception, et quand ne
dois tu pas lire.

ex : On part du principe que ton buufer de réception est vide.

Quand tu vois qu'il y a des données qui
viennent d'arriver, tu ne fais rien et tu attend qu'il n'y ai plus de
mouvement pour aller les lire.

Là tu regarde le nombre d'octets que tu
as reçu. En fonction de ce nombre tu dimmensionne un tableau d'octets.
Dans lequel tu stocke ta trame.

Puis dans une boucle, tu décode toute ta trame...



Je sais pas si ça t'aide..??
0
lbch1974 Messages postés 7 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 26 janvier 2006
26 janv. 2006 à 12:30
Merci Monsieur perathoner mais je vous signale que la boucle ne s'execute pas à l'infini car sinom le prgramme ne va pas afficher la valeur suivante qui est différente de la valeur précédente.
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
26 janv. 2006 à 13:18
"Et pourtant elle tourne" ... à l'infini



DoEvents n'a jamais fait planter quoi que ce soit. Ton message d'erreur provient bien de la pile. acecel t'a mis sur la voie dans un précédent message.


Manu
-------------------------------------------
Une question bien posée, c'est une chance de réponse bien adaptée.
0
acecel Messages postés 140 Date d'inscription jeudi 6 mai 2004 Statut Membre Dernière intervention 14 octobre 2006
26 janv. 2006 à 13:42
Au lieu d'utiliser une boucle, essaye plutôt d'utiliser un timer, en définissant un intervalle qui s'accorde bien avec la vitesse de réception des données sur ton port COM.
Dès que le programme ne recoit plus de donnée, affiche la variable Tampon à l'ecran, et réinitialise là.

Car à mon avis, la boucle est "trop rapide" pour recupérer les informations sur le port COM, lui n'arrive plus à suivre, la pile mémoire se sature, et donc ca plante.
0
lbch1974 Messages postés 7 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 26 janvier 2006
26 janv. 2006 à 15:27
Merci encore une fois
Le probléme est résolu avec l'instruction On Error Resume Next
Bon travail
0
acecel Messages postés 140 Date d'inscription jeudi 6 mai 2004 Statut Membre Dernière intervention 14 octobre 2006
26 janv. 2006 à 15:34
Si tu t'est contenté de mettre On Error Resume Next, alors tu n'as pas corrigé l'erreur, la seule différence c'est qu'elle n'apparait plus
(Dans ce cas essaye d'utiliser une des solutions proposées ici pour vraimment corriger le problème)
Sinon alors je n'ai rien dit
0
acecel Messages postés 140 Date d'inscription jeudi 6 mai 2004 Statut Membre Dernière intervention 14 octobre 2006
26 janv. 2006 à 15:35
Et dernière petite chose, si tu considère que ton problème est résolu, click sur le bouton réponse acceptée sur le post qui t'a aidé
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
26 janv. 2006 à 16:37
> Le probléme est résolu avec l'instruction On Error Resume Next



Fichtre ! En voilà une aberration !

Tu n'as rien corrigé du tout. Ca s'appelle "étouffer le problème", avec
les conséquences que çà peut avoir sur la suite du code...






Manu
-------------------------------------------
Une question bien posée, c'est une chance de réponse bien adaptée.
0
perathoner Messages postés 90 Date d'inscription dimanche 5 novembre 2000 Statut Membre Dernière intervention 26 juillet 2006
26 janv. 2006 à 17:19
Tu pose un Timer, avec un interval de 10.

Au prélable, tu initialise correctement du control MsComm (Vitesse, parité...)



'###############################################################

Public MemNbOctet As Integer 'Mémorise le Nb d'octet en attente en lecture

Public TabOctet() As Byte
'Tableau dans lequel tu mémorise les données
issues du buffer



Private Sub Timer1_Timer()

Dim nboctet As Integer

nboctet = 0



' Retourne le nombre d'octet en attente de lecture

nboctet = MSComm1.InBufferCount



' On cherche si on est bien à la fin de la question...

If nboctet = MemNbOctet Then

If nboctet > 0 Then

' Stocke dans un tableau d'octets pour traitement par la suite

ReDim Preserve TabOctet(nboctet - 1)

TabOctet = MSComm1.Input

' [ ICI TRAITEMENT DE TES INFOS ]

End If

Else

MemNbOctet = nboctet

End If

End sub

' ######################################################



Après, à toi de faire le traitement approprié afin de décortiquer les données dans le tableau TabOctet()....



Franchement je vois pas comment ça peut ne pas fonctionner...
0
Rejoignez-nous