Communication Port serie avec NetComm - utilisation et Multithreads [Résolu]

Messages postés
3
Date d'inscription
jeudi 8 décembre 2011
Dernière intervention
9 décembre 2011
- - Dernière réponse : Refut
Messages postés
3
Date d'inscription
jeudi 8 décembre 2011
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
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
72
3
Merci
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).

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 110 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Jack
Messages postés
14356
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
14 janvier 2019
365
0
Merci
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
---
Commenter la réponse de NHenry
Messages postés
3
Date d'inscription
jeudi 8 décembre 2011
Dernière intervention
9 décembre 2011
0
Merci
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 !
Commenter la réponse de Refut
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
72
0
Merci
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)
Commenter la réponse de cs_Jack
Messages postés
3
Date d'inscription
jeudi 8 décembre 2011
Dernière intervention
9 décembre 2011
0
Merci
SUPER pour ton info Jack, il ne manquais que de definir le RThreshold ! Merci beaucoup ! (j'ai bien suprime la boucle !)
Commenter la réponse de Refut

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.