S4ngo
Messages postés51Date d'inscriptionmercredi 15 décembre 2004StatutMembreDernière intervention11 mai 2006
-
20 mars 2006 à 12:45
S4ngo
Messages postés51Date d'inscriptionmercredi 15 décembre 2004StatutMembreDernière intervention11 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
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 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
cs_DURANDO
Messages postés34Date d'inscriptionjeudi 16 février 2006StatutMembreDernière intervention21 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é.
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 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).
cs_DURANDO
Messages postés34Date d'inscriptionjeudi 16 février 2006StatutMembreDernière intervention21 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é.
Vous n’avez pas trouvé la réponse que vous recherchez ?