VB et port com

Signaler
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013
-
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
-
Bonjour a tous,

Je suis tout nouveau sur le forum et j'utilise VB pour mon projet de fin d'année. Le projet consiste à la mise en place d'un outil codé en VB permettant de configurer un switch par le port com.
J'ai fait un test en écrivant ce code pour envoyant la commande "reload" au switch mais j'ai une erreur à l'exécution :

Private Sub cmdEnvoi_Click()
 MSComm.CommPort = 1 'On définit le port série qui sera utilisé (ici Port 1)
 MSComm.Settings = "9600,n,8,1" 'On définit ici les paramètres de transmission (je les explique dans un instant).
 MSComm.PortOpen = True 'Ici on ouvre le port de communication
 MSComm.Output = "reload" 'Maintenant on envoie nos informations, ici le caractère "M"
 MSComm.PortOpen = False 'Et pour finir on ferme le port de communication
End Sub

J'ai une erreur 424 qui dit objet manquant !
Et apparemment il ne connait pas la première ligne puisqu'il la surligne en jaune...

Quelqu'un pourrait-il m'aider s'il vous plait ??

Merci d'avance

42 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
39
salut,

il faut poser un composant mscomm sur ta form
Microsoft Comm Control 6.0 (VB6)
pour VB.NET, sans certitude, contrôle SerialPort

++

<hr size="2" width="100%" />
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013
1
Je l'avais deja mis le composant mais ca a rien changé
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
39
normal, il ne se nomme pas MSComm par défaut, mais MSComm1
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
EN .Net, il est préférable d'abandonner le composant MSCOMM (et tous les ocx de manière générale) et utiliser à la place la classe System.IO.SerialPort.

SerialPort n'a pas obligatoirement besoin d'être posé sur l'écran, il peut être instancié directement par le code.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
39
(salut casy, d'accord avec toi mais vue la déclaration du CLICK..... )
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013
1
Merci de vos réponses, mais dans ce cas comment puis je envoyer une chaine de caractère sur le port console ?

Encore merci
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Effectivement PCPT, vu la déclaration du click, on est bien en VB6. C'est donc bien MSCOMM qu'il faut utiliser.

Dans ce cas, il faut obligatoirement poser le composant sur la form. Par défaut il va s'appeler mscomm1.

Par contre, une fois la chaine envoyée au composant, il afut peut-etre lui laisser le temps de l'emettre avant de refermer le port.

----
Private Sub cmdEnvoi_Click()
MSComm.CommPort = 1                   'On définit le port série qui sera utilisé (ici Port 1)
MSComm.Settings = "9600,n,8,1"    'On définit ici les paramètres de transmission (je les explique dans un instant).
MSComm.PortOpen = True                'Ici on ouvre le port de communication
MSComm.Output = "reload"              'Maintenant on envoie nos informations, ici le caractère "M"
While MSComm1.OutBufferCount > 0
   DoEvents
Loop
MSComm.PortOpen = False               'Et pour finir on ferme le port de communication
End Sub
, ----
, ----
[../code.aspx?ID=41455 Coloration Syntaxique pour VB6 By ]

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013
1
J'ai une erreur a la compliation :

"Loop sans do"

Je suppose qu'il faut rajouter un "do" mais ou ça ?
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013
1
Lorsque que j'enlève la boucle je retombe encore sur mon erreur "un objet est requis"
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Désolé, c'est pas Loop qu'il faut mettre mais Wend

Remplace juste Loop par Wend, ça devrait être bon.

[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013
1
Ca l'air effectivement de mieux marcher, je n'ai plus d'erreur.
Seulement en fait pour reloader le switch par exemple, il faut envoyer en suivant une confirmation qui est la touche "entrée".

Comment puis je faire ?

Encore merci
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Je comprend pas bien ton truc de confirmation par la touche "Entrée"

Veux-tu dire qu'il faut envoyer le caractère CR (retour chariot) sur le port série à la suite de la commande pour la valider ?

Dans ce cas envoie tout d'un bloc avec :
MSComm.Output = "reload" & VBCR 'Maintenant on envoie nos informations, ici le caractère "M"


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013
1
Oui voila, seulement je n'ai pas l'impression que cela fonctionne :(

Faut que je regarde deux trois trucs.
Est-il aussi possible d'envoyer par exemple :

configure terminal
=> CR
vlan 100
=> CR

(les deux commandes a la suite)
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Si ton appareil l'accepte, tu peux effectivement envoyer plusieurs commandes à la suite.
C'est une chaine de caractère que tu envoie, il te suffit donc de la construire comme tout chaine

MsComm1.Output = "Cmd_1" & VBCR & "Cmd_2" & VBCR & "Cmd_3" & VBCR .....

Vérifie aussi dans la doc de ton appareil si le caractère de validation de la commande est le retour chariot (CR) codé par VBCR, le saut de ligne (LF) codé par VBLF, ou la combinaison des 2 (CR+LF) codés par VBCRLF


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013
1
Je te remercie, le reload fonctionne bien, il suffisait juste de mettre deux fois "& VBCR" puisqu'il fallait deux fois entrée pour valider la commande.

Ca fonctionne également comme tu dis pour les deux commandes.

Je pense que j'aurai d'autre petites questions plus tard, mais en attendant je te remercie encore de ta très précieuse aide.
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013
1
Bonjour,

J'ai un peu avancé dans mon projet.
Je suis a nouveau confronté à un problème.
J'ai cré une fenêtre dans mon interface.
J'aimerai que dans cette fenêtre je puisse voir les commandes que j'envoie sur le port COM.
J'aimerais en fait me servir de cette fenêtre comme un hyperterminal. Pouvoir directement taper dedans les commandes, ou au choix voir simplement les commandes que j'envoie.

Je ne sais pas si je suis clair.
Merci de ton aide
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
SI c'est simplemnt afficher la commande que tu envois, il te suffit au moment de l'envoie, de mettre la même valeur dans un label sur l'écran :

maCommande = "commandeBidule" & VBCR
Me.Label1.Caption = maCommande  ' affichage
MSCOMM1.Output = maCommande ' envoi


SI c'est au contraire l'envoi d'une commande saisie sur l'écran, tu pourais faire :
MSCOMM1.Output = Me.TextBox1.Text & VBCR 'tu ne peux pas saisie de CR, il faut donc le rajouter à l'envoi


Il s'agit ici de saisir une commande en texte clair, qui sera envoyer telle quelle.

Tu pourrais très bien imaginer saisir en texte clair de code hexa que tu enverrais en binaire (ex: saisir "AB 42" pour envoyer &hAB puis &h42). Il te faudrait, dans ce cas là, non pas envoyer directement, mais intercaler un petit bout de code pour interpréter le texte saisi et construire la trame à envoyer

Ce ne sont que quelques pistes parmi de nombreuses

[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013
1
Encore merci de ta réponse,

J'aimerais que cela s'affiche dans un champ TextBox. En fait, comme dans un hyperterminal, pouvoir afficher ce que le Switch va me renvoyer comme réponse à mes commandes également.

En gros, comme dans un Hyperterminal qui discute avec la machine, je peux lui envoyer les commandes directement a partir de mon TextBox et je vois ce qu'il me répond dans ce texte. Une sorte de discussion en mode connecté en gros.

Je ne sais pas si je suis clair
Messages postés
267
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
26 novembre 2013
1
Bonjour,

Je prends la conversation en cours... J'ai lu en rapide.
Le principe que tu souhaite c'est que les informations que tu recois, tu les affiches directement dans une zone de texte... Je suis pas sure que la zone de texte soit le plus judicieux pour afficher ton résultat.
Tu as juste à mettre ce que ton buffer a reçu dans ta zone de texte.

Private Sub Communique_OnComm()
Dim strBuffer As String

    Select Case Communique.CommEvent

        'liste des erreurs possibles

        Case comEventBreak      ' On a reçu un signal d'interruption (Break)
            Call Automate("ErreurReception")
        Case comEventCDTO       ' Timeout de la porteuse
            Call Automate("ErreurReception")
        Case comEventCTSTO      ' Timeout du signal CTS (Clear To Send)
            Call Automate("ErreurReception")
        Case comEventDSRTO      ' Timeout du signal de réception
            Call Automate("ErreurReception")
        Case comEventFrame      ' Erreur de trame
            Call Automate("ErreurReception")
        Case comEventOverrun   ' Des données ont été perdues
            Call Automate("ErreurReception")
        Case comEventRxOver     ' Tampon de réception saturé
            Call Automate("ErreurReception")
        Case comEventRxParity   ' Erreur de parité
            Call Automate("ErreurReception")
        Case comEventTxFull     ' Tampon d'envoi saturé
            Call Automate("ErreurReception")
        Case comEventDCB        ' Erreur de réception DCB (jamais vu)
            Call Automate("ErreurReception")
        
        ' liste des événements possibles qui sont, eux, normaux
        Case comEvCD            ' Changement dans la broche CD (porteuse)
        Case comEvCTS           ' Changement dans broche CTS
        Case comEvDSR           ' Changement dans broche DSR (réception)
        Case comEvRing          ' Changement dans broche RING (sonnerie)
        Case comEvReceive       ' Si on reçoit des données
                strBuffer = strBuffer & Communique.Input
        Case comEvSend          ' Il y a des caractères à envoyer
        Case comEvEOF           ' On a reçu le caractère EOF
    End Select
End Sub

Ensuite tu n'as qu'a afficher le résultat "strBuffer" dans ta eone de texte.
Par contre moi je te conseille de passer par une sorte d'automate qui va s'occuper de la gestion non seulement des erreurs mais aussi du traitement de ton information. Par exemple comment tu sais que ton switch a fini de t'envoyer des informations? Peut il communiquer sans que tu lui en donne "l'ordre", etc.
Voilà j'espère que j'ai été claire.
Bon courage

HellAngel777
Les machines ne font pas d'erreurs
Heureusement nous sommes humains
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013
1
Merci de votre aide, je touche presque au but.
Depuis ce matin, j'aimerai faire un tout petit truc mais je galère terriblement. J'aimerai envoyer un ping en continu sur une machine, qui affiche un voyant vert tant que ca repond et rouge des que ca coupe. Apres plusieurs recherche j'ai sorti ce code :


Private Sub Form_Load()
    'Centralisation de la fenetre
    Me.Left = (Screen.Width - Me.Width) \ 2
    Me.Top = (Screen.Height - Me.Height) \ 2
End Sub


Private Sub Ping_Click()
Dim IPAddress As String
IPAddress = "127.0.0.1"


        If My.Computer.Network.Ping(IPAddress) = False Then
             imgNotConnected.ZOrder
        Else
             imgConnected.ZOrder

        End If

End Sub





Private Sub imgConnected_Click()
'Voyant Vert
End Sub

Private Sub imgNotConnected_Click()
'Voyant Rouge
End Sub


Pourtant la fonction "My.Computer.Network.Ping" ne fonctionne pas du tout et est inconnu donc j'ai du louper quelque chose ?

Merci