MScom time-out de 5 secondes ???

don_pietro Messages postés 4 Date d'inscription vendredi 10 novembre 2006 Statut Membre Dernière intervention 10 novembre 2006 - 10 nov. 2006 à 15:12
don_pietro Messages postés 4 Date d'inscription vendredi 10 novembre 2006 Statut Membre Dernière intervention 10 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

6 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
10 nov. 2006 à 15:20
Evite Opéra pour poster ici, ça bugge parfois

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
don_pietro Messages postés 4 Date d'inscription vendredi 10 novembre 2006 Statut Membre Dernière intervention 10 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)
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0
don_pietro Messages postés 4 Date d'inscription vendredi 10 novembre 2006 Statut Membre Dernière intervention 10 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
0

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

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0
don_pietro Messages postés 4 Date d'inscription vendredi 10 novembre 2006 Statut Membre Dernière intervention 10 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
       
        childText = ChildFraiseuse.Text2.text
        savemouspointer = Screen.MousePointer
        Screen.MousePointer = 13
       
        ChildFraiseuse.ProgressBar.Visible = True
        ChildFraiseuse.ProgressBar.value = 0
       
        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

Merci beaucoup :)
0
Rejoignez-nous