Communication Port serie avec NetComm - utilisation et Multithreads

Résolu
Refut Messages postés 3 Date d'inscription jeudi 8 décembre 2011 Statut Membre Dernière intervention 9 décembre 2011 - 8 déc. 2011 à 21:29
Refut Messages postés 3 Date d'inscription jeudi 8 décembre 2011 Statut Membre Dernière intervention 9 décembre 2011 - 9 déc. 2011 à 16:35
Tous d'abort, Bonjour a Tous,

Ayant passe de nombreuses heures a "Googliser" et ayant trouve de nombreuses reponsse a mes soucis par le passe, c'est naturellement que je vien chercher l'avis d'experts ...

Je cherche a lire des donnees arrivant sur un port serie RS232 utilisant NETComm.Ocx
Jusqu'ici tous vas bien j'arrive bien a recuperer de la donnee dans une variable utiliant la propriete "NETComm1_OnComm".

Le soucis est que travaillant en mer, sur un bateau avec connexion satellite, je ne peut pas telecharger ou installer un version de Visual basic, et devellope donc mon appli sous le VB contenus dans Excel ... (on fait avec ce qu'on as !)

j'en vient a la question (enfin, vous direz vous apres tous ce blah-blah ) :
Comment faire une boucle qui lise les donnes arrivant sur le port com en permanence, sans que cela bloque le programme ?
J'ai bien trouve sur le net des infos parlant du Threads, mais dans mon VB de excel, je ne trouve que "Application.MultiThreadedCalculation.ThreadMode" et pas moyen d'obtenir un exemple d'utilisation de cette fonction pour l'adapter a mon code ni dans l'aide ni sur internet. (Le proxy de ma boite bloque l'acces aux sites de Microsoft (c nul, je sait)) donc pas moyen d'acceder aux aides en ligne.

Esperant que quelqu'un puisse m'aider,

Merci d'avance

5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 déc. 2011 à 13:35
PS : Cet event se déclenche à chaque fois que le buffer contient au moins le nombre d'octets défini dans RThreshold.
Si ce réglage est à 0, il se déclenchera dès qu'un seul octet est reçu (pas forcement top en temps machine).
3
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
8 déc. 2011 à 22:04
Bonjour,

Donc, tu es en VBA et pas VB6, je déplace.

En VBA et VB6, pas de thread, soit tu utilises
http://msdn.microsoft.com/en-us/library/aa195809%28v=office.11%29.aspx
Soit tu utilises une boucle avec un DoEvents, mais ce sera gourmand et peu performant.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
0
Refut Messages postés 3 Date d'inscription jeudi 8 décembre 2011 Statut Membre Dernière intervention 9 décembre 2011
8 déc. 2011 à 23:25
Desole pour le mauvais placement du message.

Je ne pensse pas etre le premier a esasyer de recuperer ce type de donnees, voici un code qui fonctione en mode debug, en recuperant les donnees, mais impossible de stoper la boucle ...



Private Sub CommandButton1_Click()

'Permet Theoriquement de stoper la boucle en fermant le port ...

Select Case CommandButton1.Caption
    Case "Start"
        NETComm1.PortOpen = True
        CommandButton1.Caption = "Stop"
    Case "Stop"
        NETComm1.PortOpen = False
        CommandButton1.Caption = "Start"
End Select




End Sub

Private Sub NETComm1_OnComm()


'Lecture en boucle du port tant que celui-ci est ouvert

Dim Buffer As String
Dim PauseTime, Start


Do While NETComm1.PortOpen = True


Select Case NETComm1.CommEvent
    Case "5"
        Buffer = (NETComm1.InputData)
    Case Else
        Buffer = "NO DATA"
End Select

    TextBox1.Text = Buffer
    
    PauseTime = 2
    Start = Timer
    Do While Timer < Start + PauseTime
      
    Loop


Loop





End Sub

Private Sub UserForm_Initialize()

'Parametrage du port

NETComm1.CommPort = "7"
NETComm1.Settings = "9600,n,8,1"



End Sub


Ca marche, mais pas moyen de stopper la boucle, comment puis-je adapter un DoEvents ou un moyen de stopper la boucle ? ou un autre moyen ? enfin une idee SVP !
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 déc. 2011 à 13:28
Salut

Le dernier code que tu nous à montré est LA solution, n'en cherche pas d'autre.
Il faut utiliser les évènements générés par le port COM.
Il ne s'agit pas d'une boucle, mais d'un Event : il se déclenchera seul.
Supprime cette affreuse boucle.

Voici le code fourni dans l'aide de l'objet MSComm sous VB6 :
Private Sub MSComm_OnComm ()
   Select Case MSComm1.CommEvent
   ' Traite chaque événement ou erreur en insérant du 
   ' code sous chaque instruction Case

   ' Erreurs
      Case comEventBreak   ' Un signal d'arrêt a été reçu.
      Case comEventCDTO   ' Erreur de délai d'attente 
                     ' Détection de porteuse.
      Case comEventCTSTO   ' Erreur de délai d'attente 
                           ' Prêt à émettre.
      Case comEventDSRTO   ' Erreur de délai d'attente 
                           ' Modem prêt.
      Case comEventFrame   ' Erreur de trame
      Case comEventOverrun   ' Données perdues.
      Case comEventRxOver   ' Dépassement de la 
                           ' capacité du tampon de 
                           ' réception.
      Case comEventRxParity   ' Erreur de parité.
      Case comEventTxFull   ' Tampon de transmission 
                           ' plein.
      Case comEventDCB   ' Erreur inattendue lors de 
                        ' l'extraction du bloc de 
                        ' contrôle de périphérique]

   ' Événements
      Case comEvCD   ' Modification dans la ligne 
                     ' Détection de porteuse.
      Case comEvCTS   ' Modification dans la ligne Prêt 
                     ' à émettre.
      Case comEvDSR   ' Modification dans la ligne 
                     ' Modem prêt.
      Case comEvRing   ' Modification dans l'Indicateur 
                     ' d'appel.
      Case comEvReceive   ' Nombre de caractères indiqué 
                        ' par la propriété RThreshold reçus
          ' Cet là que tu pourras récupérer les données
          ' contenues dans le buffer
      Case comEvSend   ' Nombre de caractères indiqué 
                     ' par la propriété SThreshold 
                     ' dans le tampon de transmission.
      Case comEvEof   ' Caractère de fin de fichier 
                     ' trouvé dans le flux en entrée
   End Select
End Sub

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0

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

Posez votre question
Refut Messages postés 3 Date d'inscription jeudi 8 décembre 2011 Statut Membre Dernière intervention 9 décembre 2011
9 déc. 2011 à 16:35
SUPER pour ton info Jack, il ne manquais que de definir le RThreshold ! Merci beaucoup ! (j'ai bien suprime la boucle !)
0
Rejoignez-nous