Probleme de timer

Résolu
S4ngo Messages postés 51 Date d'inscription mercredi 15 décembre 2004 Statut Membre Dernière intervention 11 mai 2006 - 20 mars 2006 à 12:45
S4ngo Messages postés 51 Date d'inscription mercredi 15 décembre 2004 Statut Membre Dernière intervention 11 mai 2006 - 21 mars 2006 à 13:39
Salut je travail sur une application vb6, et mon objectif est de
récupérer des données qui arrivent ur le port COM. En fait, la carte
qui m'envoie les données le fait sans cesse, mais moi je desire créer
un timer (ex: 1sec, 10sec,...) qui va me permettre de piocher dans les
données en fonction de mon timer.


Mais je n'y parvient pas, mon timer ne sert a rien car mon application
récupere les données de la meme façon qu'elles arvent, c'est a dire
sans cesse.


je pensais integrer le timer dans la partie case, mais je n'y arrive pas :s


Merci davance pour votre aide








code:


'declaration des variables


Public temps1 As Integer


Public temps2 As Integer


Public temps3 As Integer





'configuration timer


Private Sub Timer1_Timer()


Dim out(0) As Byte


If temps3 = 0 Then


out(0) = 0


MSComm1.Output = Chr(65)


temps3 = temps2


Else


temps3 = temps3 - 1


End If


End Sub








'a la reception enregistrement sous excel


Private Static Sub MSComm1_OnComm()


Dim résultat() As Byte


Dim So2 As Single


Dim Mire As Single


Dim No2 As Byte


Select Case MSComm1.CommEvent


Case comEvReceive


résultat() = MSComm1.Input


So2 = résultat(1)


Label3.Caption = Format(So2, "Fixed")


Mire = résultat(0)


Label4.Caption = Format(Mire, "Fixed")


Label1.Caption = Time


No2 = résultat(2)


Label8.Caption = Format(No2, "Fixed")


Label3.LinkItem = "L" & ligne & "C2"


Label1.LinkItem = "L" & ligne & "C1"


Label4.LinkItem = "L" & ligne & "C4"


Label8.LinkItem = "L" & ligne & "C3"


Label3.LinkPoke


Label1.LinkPoke


Label4.LinkPoke


Label8.LinkPoke


ligne = ligne + 1


End Select


End Sub

7 réponses

rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
21 mars 2006 à 09:41
Salut S4ngo, salut Durando,

bon d'acccord, mais tu es responsable du fait que j'aurais fumé une cigarette de plus :)
Notes bien, s'il te plait, que je ne l'ai pas mis en oeuvre (même pas une fois), je l'ai juste écrit (copie et colle dans VB, ce sera plus lisible). C'est le principe qui est important, pas la méthode. Je te laisse trouver ce qu'il faut faire dans le timer pour, éventuellement, consommer (vider les éléments traités) le tampon membre, et éviter de gaspiller de la mémoire.
Au risque de répéter Durando, pour éviter l'usine à gaz (mais bon, quand on comprend ce qu'on écrit, et qu'on le documente, l'usine à gaz c'est pas si grave), utilises le mode de fonctionnement qui consiste à donner la taille des données (dans la propriété .RThreshold) à partir de laquelle, une fois atteinte, l'évènement OnComm() se déclenchera (c'est le plus pratique quand les données que tu reçois sont de taille fixe).

Private bytTampon() As Byte 'le tampon membre
Private intIndiceATraiter As Integer 'indice de parcours du tampon membre,
'pour traitement (il pointe vers le prochain
'élément à traiter)


Private Sub Form_Load()
intIndiceATraiter = 0
End Sub


Private Sub MSComm1_OnComm()
Dim bytTemp() As Byte 'tampon temporaire, local à la procédure
', écrasé à chaque fois
Dim intDimensionDerLecture As Integer 'indice de lecture du tampon temporaire
Dim intDimensionAncienTampon As Integer 'indice du dernier élément du tampon membre
', avant redimensionnement
Dim intDimensionNvelleTaille As Integer 'indice du dernier élément du tampon membre
', après redimensionnement
Select Case MSComm1.CommEvent
Case comEvReceive
'lit les données en entrée du MSComm
bytTemp() = MSComm1.Input
'stocke les tailles
intDimensionDerLecture = UBound(bytTemp)
intDimensionAncienTampon = UBound(bytTampon)
intDimensionNvelleTaille = intDimensionAncienTampon + intDimensionDerLecture
'redimensionne le tampon, en préservant les données déjà stockées
ReDim Preserve bytTampon(intDimensionNvelleTaille)
'initialise un indice de parcours du tampon temporaire
intIndiceLecture = 0
'de l'ancien dernier élément +1 au nouveau dernier élément vide
For i = intDimensionAncienTampon + 1 To intDimensionNvelleTaille
'recopie l'élément du tampon temporaire,
'vers le tampon membre
bytTampon(i) = bytTemp(intIndiceLecture)
'incrémente l'indice de lecture du tampon temporaire
intIndiceLecture = intIndiceLecture + 1
Next i

End Select
End Sub


Private Sub Timer1_Timer()
Dim sngSo2 As Single
Dim sngMire As Single
Dim bytNo2 As Byte
'récupère à partir du tampon
sngMire = bytTampon(intIndiceATraiter)
sngSo2 = bytTampon(intIndiceATraiter + 1)
sngNo2 = bytTampon(intIndiceATraiter + 2)
'prépare le prochain indice à traiter
intIndiceATraiter = intIndiceATraiter + 3

End Sub

Dis nous ce que tu en penses,
à+

rvblogn
3
cs_DURANDO Messages postés 34 Date d'inscription jeudi 16 février 2006 Statut Membre Dernière intervention 21 mars 2006
21 mars 2006 à 10:59
Salut s4ngo et rvblog.

Une question :

les données recues (ou variables) sont-elles recues en une seule trame (cas1) c'est à dire une seule réception pour toutes les données sur le port COM, ou bien une trame par donnée (cas2) ?



exemple cas 1 :

trame "v1 32767 v2 = 00001 v3 = 00200" & vbcrlf

exemple cas 2 :

tramepour v1 "v1 32767" & vbcrlf

tramepour v2 "v2 00001" & vbcrlf

tramepour v3 "v3 00200" & vbcrlf



La question est importante, parce dans le cas 1, il suffit d'utiliser un tampon fixe et de l'écraser à chaque réception.



Ne sachant pas à quoi resemblent les trames et dans quel ordre sont recues les données, difficile de proposer qqchose.



On a peut-être répondu à coté de la plaque!

S4ngo peux-tu préciser?





C'est pas parceque les c.. sont plus nombreux qu'ils ont forcément raison!(dixit Coluche)
Une seule ligne de conduite, l'objectivité.
3
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
20 mars 2006 à 13:08
Salut S4ngo,

essaies peut-être de travailler avec un tampon. C'est à dire, quand MSComm1_OnComm() survient, au lieu de garder le MSComm1.Input dans ton tableau Resultat(), gardes-le dans un tableau membre (déclaré en dehors de ta procédure), et dans ton Timer1_Timer() tu travailles directement sur le tampon. Cela revient un peu à faire ce que tu fais déjà, mais il faut juste décaler les traitements (en réception, tu réceptionne, et en cyclique, tu traites [Excel et autres]).
Attention à consommer le tampon (soit tu marques ce que tu a déjà traité et tu ne traites pas ce qui est déjà marqué, soit tu fais disparaître ce que tu as traité [consommé], comme le fait le buffer de mscomm [MSComm1.Input ], une fois que tu l'as lu, il est vide!).

Si tu as MSDN, tu peux aussi trouver d'autres manières d'utiliser ce composant (ex: définir une taille de données reçues à partir de laquelle, une fois atteinte, se déclenchera l'évennement du mscomm, mais d'autres manières aussi).

à+
rvblogn
0
cs_DURANDO Messages postés 34 Date d'inscription jeudi 16 février 2006 Statut Membre Dernière intervention 21 mars 2006
20 mars 2006 à 14:02
Salut,

je confirme la solution de rvblog.

J'ai réalisé une appli en turbo-pascal ou je devais reconnaitre des
chaines de caracteres transitant entre PC <-> terminal.

J'ai résolu en créant un tampon FIFO alimenté par les caractères venant
du port com. J'analysais ensuite ce tampon pour détecter la présence ou
non des chaines.



Tu peux déclencher l'analyse avec un timer ou également en comptant le nombre de caractères recus.




C'est pas parceque les c.. sont plus nombreux qu'ils ont forcément raison!(dixit Coluche)
Une seule ligne de conduite, l'objectivité.
0

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

Posez votre question
S4ngo Messages postés 51 Date d'inscription mercredi 15 décembre 2004 Statut Membre Dernière intervention 11 mai 2006
20 mars 2006 à 19:45
Tout dabord, meri pour vos réponses, parcontre je ne comprend pas trop ce que tu ve dire [../auteurdetail.aspx?ID=461923 rvblog] :s

Javoue que je débute sur vb6, et de plus, je n'est pas MSDN (ce qui est une grosse erreur de ma part).

Peut tu essayer de me donner ne serais-ce qu'un exemple rapide de ce que je devrais faire ?

Merci d'avance.
0
S4ngo Messages postés 51 Date d'inscription mercredi 15 décembre 2004 Statut Membre Dernière intervention 11 mai 2006
21 mars 2006 à 13:36
c'etait le deuxieme cas !!!

En effet, j'ai 3 données qui arrivent l'une apres l'autre en série.

Et oui vous avez repondu a ma, ou mes questions, merci beacoup !
0
S4ngo Messages postés 51 Date d'inscription mercredi 15 décembre 2004 Statut Membre Dernière intervention 11 mai 2006
21 mars 2006 à 13:39
oh fait dsl rvblog pour la cigarette en plus :s :D
0
Rejoignez-nous