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

Refut 3 Messages postés jeudi 8 décembre 2011Date d'inscription 9 décembre 2011 Dernière intervention - 8 déc. 2011 à 21:29 - Dernière réponse : Refut 3 Messages postés jeudi 8 décembre 2011Date d'inscription 9 décembre 2011 Dernière intervention
- 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
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 9 déc. 2011 à 13:35
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).

Merci cs_Jack 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de cs_Jack
NHenry 14286 Messages postés vendredi 14 mars 2003Date d'inscription 29 octobre 2018 Dernière intervention - 8 déc. 2011 à 22:04
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
Refut 3 Messages postés jeudi 8 décembre 2011Date d'inscription 9 décembre 2011 Dernière intervention - 8 déc. 2011 à 23:25
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
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 9 déc. 2011 à 13:28
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
Refut 3 Messages postés jeudi 8 décembre 2011Date d'inscription 9 décembre 2011 Dernière intervention - 9 déc. 2011 à 16:35
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.