don_pietro
Messages postés4Date d'inscriptionvendredi 10 novembre 2006StatutMembreDernière intervention10 novembre 2006
-
10 nov. 2006 à 15:12
don_pietro
Messages postés4Date d'inscriptionvendredi 10 novembre 2006StatutMembreDernière intervention10 novembre 2006
-
10 nov. 2006 à 19:02
Bonjour à la communauté Vbfrance, javascript:Insert_Emoticon('/imgs2/smile.gif');
J'ai un petit souci avec ma transmission sur RS232, j'utilise MsComm mais après 5 secondes il vide mon buffer de transmission :S (et quelque soit ma vitesse de transmission), que soit ou non relier à un périphérique :S. Alors je me demandais si par hasard il y avait un time-out spécial javascript:Insert_Emoticon('/imgs2/smile_question.gif');javascript:Insert_Emoticon('/imgs2/smile_question.gif');
Voici le code incriminé (j'écrit que la partie la plus interressante) :
MainForm.MSComm.Output = Buffer()
ChildFraiseuse.ProgressBar.Visible = True
ChildFraiseuse.ProgressBar.value = 0
Do
MsgBox (MainForm.MSComm.CTSTimeout)
Dim pourcentage As Integer
pourcentage = ((progressTotal - MainForm.MSComm.OutBufferCount) / progressTotal) * 100
If pourcentage >= 0 Then
ChildFraiseuse.ProgressBar.value = pourcentage
ChildFraiseuse.ProgressBar.Refresh
End If
Loop Until MainForm.MSComm.OutBufferCount = 0
MsgBox (MainForm.MSComm.CommEvent)
'fermeture de la connection
MainForm.MSComm.PortOpen = False
don_pietro
Messages postés4Date d'inscriptionvendredi 10 novembre 2006StatutMembreDernière intervention10 novembre 2006 10 nov. 2006 à 15:29
Lol je vois pas très le résultat lol.
Comme je trouve pas le bouton éditer :S, je vais réécrire le message ici (désolé) :
Bonjour à la communuauté Vbfrance [javascript:Insert_Emoticon('/imgs2/smile.gif'); ]
J'ai un petit souci avec ma transmission par RS232, j'utilise Mscom mais après 5 secondes il vide mon buffer de transmission :S et ce quelque soit ma vitesse de transmission & que je soit connecté à un périphérique ou non :S. Alors je me demandais si par hasard il n'y aurait pas un petit time out spécial qui engendrerait ce problème ?????
Voici le code incriminé (Uniquement la partie interressante) :
MainForm.MSComm.Output = Buffer()
ChildFraiseuse.ProgressBar.Visible = True
ChildFraiseuse.ProgressBar.value = 0
Do
MsgBox (MainForm.MSComm.CTSTimeout)
Dim pourcentage As Integer
pourcentage = ((progressTotal - MainForm.MSComm.OutBufferCount) / progressTotal) * 100
If pourcentage >= 0 Then
ChildFraiseuse.ProgressBar.value = pourcentage
ChildFraiseuse.ProgressBar.Refresh
End If
Loop Until MainForm.MSComm.OutBufferCount = 0
MsgBox (MainForm.MSComm.CommEvent)
'fermeture de la connection
MainForm.MSComm.PortOpen = False
Merci d'avance a tout le monde et encore désolé de mon premier post (Aie aie opéra lol)
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 10 nov. 2006 à 17:01
Alors dès que tu met des caractères dans le buffer d'emission (.Output), ils sont immédiatement envoyés sur le port série.
Il est donc normal que le buffer de transmission se vide.
Pour ton code, je ne vois pas d'ou sort CTSTimeout, ce n'est pas une propriete du controle (ou alors on a pas les mêmes versions)
Ta boucle est blocante, c'est à dire quelle va tourner en permanence sans rendre la main et bloquer le reste de l'application.
Il faudrait rajouter un DoEvents, pour rendre la main au système et ainsi permettre au controle (et autre) de fonctionner correctement.
A moins que tu ais beaucoup de caractères à envoyer, sinon ta barre de progression ne va pas servir à grand chose, sachant que même à 9600Bauds si tout se passe bien, tu envoie environ 960 octets à la seconde. En gros elle n'aura même pas le temps de s'affichée.
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
don_pietro
Messages postés4Date d'inscriptionvendredi 10 novembre 2006StatutMembreDernière intervention10 novembre 2006 10 nov. 2006 à 17:50
Merci beaucoup pour ta réponse, mais elle entraîne d'autre questions ;) lol
En rajoutant le DoEvents je devrais pouvoir récupérer l'événement qui me vide le tampon dans la méthode OnComm() ??? Si c'est le cas rien n'y est affiché :S.
Pour le CTSTimeOut il n'est pas non plus dans mes propiétés de contrôles mais c'était un test que je faisais suite à la lecture d'un pdf sur MScomm trouver sur internet. Dedans on y trouvait d'autre Timeout telles que le CTSTimeout, DRSTimeout, CDTimeout.... Mais bon de toute façon la valeur afficher est 0.
Je dois envoyer pas mal d'infos enviros 9000 charchatères donc ca devrait faire au environ de 7~10 secondes, le problème c'est toujours ce reset du buffer après 5 secondes. Est ce que vois d'ou pourrait venir ce timeout ????? Ou comment le détecter ???
Voici le nouveau code modifier selon tes conseils :
ChildFraiseuse.ProgressBar.Visible = True
ChildFraiseuse.ProgressBar.value = 0
Buffer() = ChildFraiseuse.Text2.text
MainForm.MSComm.Output = Buffer()
Do
Dim pourcentage As Integer
pourcentage = 100 * (progressTotal - (MainForm.MSComm.OutBufferCount / 8)) / progressTotal
If pourcentage >= 0 Then
ChildFraiseuse.ProgressBar.value = pourcentage
ChildFraiseuse.ProgressBar.Refresh
End If
DoEvents
Loop Until MainForm.MSComm.OutBufferCount = 0
Autre Question tant que j'y suis le OutBufferCount c'est bien des octets qu'ils retournent ??? le truc c'est quand je fait un Len de mon ChildFraiseuse.Text2.text il me retourne 9587, mais la première msgbox que je faisait de MainForm.MSComm.OutBufferCount il me retourne environ 18000 ??? Une explication ???
En cas merci beaucoup
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 10 nov. 2006 à 18:44
Il semblerait effectivement qu'il y est un problème, moi aussi au bout 5/6 secondes plus rien.
A haute vitesse pas de soucis, mais à vitesse plus faible, on sort de la boucle avant que la totalité de la trame soit envoyer. Maintenant il faudrait voir ce qui est réellement envoyer en sortie du port
Je n'ai pas le matériel pour vérifier si ce qui est emis sur le port est complet mais je doute.
J'ai pourtant plusieurs années d'expérience en com série, mais là sur le coup j'ai un manque d'imagination pour savoir d'ou ça vient.
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
don_pietro
Messages postés4Date d'inscriptionvendredi 10 novembre 2006StatutMembreDernière intervention10 novembre 2006 10 nov. 2006 à 19:02
Effectivement moi ca fait un petit moment que je planche sur le problème et je comprends pas, j'en déduis que le système d'exploitation Windows doit faire un reset du buffer toutes les 5 secondes si une ??? réponses n'est pas donnée. Mais bon ce n'est que pur spéculation. En attendant ce problème est bien bien lourd, je l'ai contourné par le code :
Dim debut, fin, i As Integer
debut = 1
i = 1
Dim savemouspointer As Integer
Dim childText As String
Dim test As String
Do While (fin < Len(childText))
fin = i * 80
If fin >= Len(childText) Then
fin = Len(childText)
End If
'Buffer() = Mid(ChildFraiseuse.Text2.text, b, c)
'MainForm.MSComm.Output = Buffer()
MainForm.MSComm.Output = Mid(childText, debut, 80)
Do
Dim pourcentage As Integer
'pourcentage = (((progressTotal) - MainForm.MSComm.OutBufferCount) / (progressTotal * 8)) * 100
'pourcentage = 100 * (progressTotal - (MainForm.MSComm.OutBufferCount / 8)) / progressTotal
pourcentage = (fin / progressTotal) * 100
If pourcentage >= 0 Then
ChildFraiseuse.ProgressBar.value = pourcentage
ChildFraiseuse.ProgressBar.Refresh
End If
DoEvents
Loop Until MainForm.MSComm.OutBufferCount = 0
i = i + 1
debut = fin + 1
Loop
Screen.MousePointer = savemouspointer
'fermeture de la connection
MainForm.MSComm.PortOpen = False
Exit Sub
Maintenant ca marche, mais bon ca ne me dit toujours pas d'ou vient ce reset. En tout merci beacoup pour ton aide le DoEvents ma bien servit :).
Si quelqu'un trouve une réponse a ces 5 secondes ... ça m'intéresse volontier