IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

gestion de la liaison série avec VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 96
    Points : 44
    Points
    44
    Par défaut gestion de la liaison série avec VBA
    Bonjour,

    Je voudrais envoyer ou recevoir des données par le porte série.
    Pour la réception, j'ai un micro-controleur qui envoie des données sur le port série et l'aide d'une macro VBA je voudrais les ranger dans une page excel.

    Si vous avez une idée

    Merci d'avance

    CC

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Tu peux déjà jeter un oeil ici
    Tu peux aussi faire une recherche sur le forum, le sujet a déjà été traité. Par exemple, http://www.developpez.net/forums/sho...hlight=s%E9rie
    Avec "Série" comme mot clé tu auras plus de chances qu'avec Liaison série (...)
    Bonne chance

  3. #3
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 96
    Points : 44
    Points
    44
    Par défaut liaison série en VBA
    Bonjour,

    j'essaie d'envoyer un message par le port série

    Voici le programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub CommandButton1_Click()
    MSComm1.ComPort=1
    MSComm1.Settings="9600,n,8,1"
    MScomm1.PortOpen=True
    MSComm1.OutPut="c'est moi"
    MSComm1.PortOpen=False
    End Sub
    Je pense envoyer le message "c'est moi" sur le port série.
    Lorsque j'ouvre hyperterminal.
    J'ai un message erreur ort already open.
    Avez vous une idée ?

    PS:Sur ma prise RS 232, j'ai mis un bouchon ou pas j'ai le même message d'erreur !!

    CC

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Teste ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub CommandButton1_Click()
        With MSComm1 'configuration du port
        If .PortOpen Then _
            .PortOpen = False 'ouverture du port
            .CommPort = 1 'On utilise le port COM1:
            '.Handshaking = 2 'RTS
            '.RThreshold = 1
            '.RTSEnable = True 'mieux pour le port COM:
            .Settings = "9600,n,8,1"
            '.SThreshold = 1
            .PortOpen = True 'ouverture du port
            .OutPut = "c'est moi"
            .PortOpen = False 'ouverture du port
        End With
    End Sub
    Testé sans erreur mais jamais utilisé (!)
    Tu dis

  5. #5
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 96
    Points : 44
    Points
    44
    Par défaut liaison série en VBA
    Bonjour,

    Avec votre programme, j'ai toujours le même message d'erreur !!

    Est ce un problème de configuration de l'hyperterminal ?

    CC

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Généralement, pour pouvoir échanger des données via le port série, outre la configuration du port ("9600,n,8,1") il ya un protocole de transmission entre le terminal et la carte série pour indiquer que le récepteur est prêt à recevoir. Ce peut être Xoff/Xon, RTS/CTS ou DSR/DTR...
    Par défaut, c'est le protocole hardware XOFF/XON (^Q/^S) en apposition aux autres protocoles gérés par programmation (software)
    Comme tout ça est vieux pour moi, te te conseille une lecture
    Tu peux aussi faire une recherche sur google avec Liaison série, protocole, RS232, etc.
    Tu aurais peut-être intérêt à poser également ta question sur le forum VB6. Le contrôle MSComm est utilisé en VB et je pense que tu auras des réponses plus pointues sur ce forum.
    Bonne chance

  7. #7
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 96
    Points : 44
    Points
    44
    Par défaut liaison série en VBA (réception)
    Bonjour,

    J'arrive à envoyer du texte par la liaison série et maintenant je voudrais en recevoir
    Voila mon programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Private Sub CommandButton1_Click()
        MSComm1.InBufferCount = 0
        MSComm1.Settings = "9600,n,8,1"
        MSComm1.InputLen = 1
     
     
         MSComm1.PortOpen = True 'ouverture du port
          Do While MSComm1.Input <> "+"
          Loop
     
          ActiveCell.Value = CSng(MSComm1.Input)
          ActiveCell.Offset(1, 0).Select
     
         MSComm1.PortOpen = False 'ouverture du port
     
    End Sub
    Quand je tape sur + je sors de la boucle, je n'arrive pas à mettre la valeur réception dans une cellule de page excel

    Connaissez vous la procédure ?

    Merci d'avance

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    On peut supposer que la ligne se terminera par un caractère de contrôle, retour chariot, vbcr, ou renvoi à la ligne, vblf. Je testerais l'un et l'autre...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    dim ok as boolean
    Do While not ok
         result = result & MSComm1.Input
         ok = right(result,1) = vbcr or right(result,1) = vblf
    Loop
    Mais là, c'est un vague souvenir et je ne garantis vraiment rien.
    Peux-tu nous mettre le code pour envoyer par la RS, ça pourrait rendre service à d'autres.
    Merci

  9. #9
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 96
    Points : 44
    Points
    44
    Par défaut liaison série en VBA (réception)
    Bonsoir,

    J'essaie toujours de faire de la transmission sur port série en VBA.
    J'arrive à envoyer des messages, mais je n'arrive pas à recevoir ou plutôt à visualiser des messages reçus .

    voici mon programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Private Sub CommandButton1_Click()
     
     
     MSComm1.InBufferCount = 0
      MSComm1.Settings = "9600,n,8,1"
      MSComm1.InputLen = 1024
      MSComm1.InBufferSize = 2048
     
     
        MSComm1.PortOpen = True 'ouverture du port
     
      DoEvents
      tampon = tampon & MSComm1.Input ' Concaténation
      Range("B5").Value = MSComm1.Input
    Loop Until InStr(tampon, Chr(13))
     
     
           MSComm1.PortOpen = False 'ouverture du port
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Traitement(tampon As String)
    'cette procédure sert à traiter l’information reçue dans le tampon
         'Text1.SelStart = Len(Text1.Text)
        'Text1.SelText = tampon 'ici, on affiche le résultat dans un champ de texte
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub MSComm1_OnComm()
     
    End Sub
    Avez vous une idée pour visualiser ces messages

    merci d'avance

    CC

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    déjà, remplace
    Range("B5").Value = MSComm1.Input
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B5").Value = Tampon
    En mettant ... = MSComm1.Input, tu écrases la dernière donnée reçue et si c'est une ligne vide, tu insères un simple vbcr dans ta cellule, vbcr qui sera invisible...
    Tu peux déjà faire ça
    (sans garantie que ça règle tous les problèmes)
    Bonne soirée

  11. #11
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 96
    Points : 44
    Points
    44
    Par défaut liaison série en VBA (réception)
    merci pour ta réponse

    Maintenant j'arrive à recevoir des messages
    Voici le programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Private Sub CommandButton1_Click()
     
     MSComm1.InBufferCount = 0
      MSComm1.Settings = "9600,n,8,1"
      MSComm1.InputLen = 1024
      MSComm1.InBufferSize = 2048
     
        MSComm1.PortOpen = True 'ouverture du port
     
      DoEvents
      tampon = tampon & MSComm1.Input ' Concaténation
      Range("B5").Value = tampon
    Loop Until InStr(tampon, Chr(13))
     
           MSComm1.PortOpen = False 'ouverture du port
        End Sub
     
     
    Private Sub MSComm1_OnComm()
     
    End Sub
    Je les reçois dans la cellule B5

    Je voudrais changer de cellule à chaque caractère.
    Quelle fonction doit -on mettre en place ?

    Merci d'avance

    CC

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Pense à baliser ton code -> Sélection plus un clic sur l'icône # en mode d'édition, ça m'évitera de le faire pour chacun de tes messages.

    Il manque un bout à ton code, tel que tu le mets, tu dois avoir une erreur : Loop until... sans Do...
    Peux-tu mettre ton code tel qu'il fonctionne ?
    A+

  13. #13
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 96
    Points : 44
    Points
    44
    Par défaut liaison série en VBA réception
    Bonsoir,

    On m'a proposé ce programme pour répondre à mon besoin mais j'ai une erreur de synthaxe.
    Pouvez vous m'aider ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    row=1
    Do
    DoEvents
    buffer=MSComm1.Input
    If Len(buffer)>0 Then tampon=tamponbuffer:Cells(row,1)=tampon:row=row+1 (erreur de compilation erreur de syntaxe)
    Loop Until InStr(buffer, Chr(13))
    Merci d'avance

    CC

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Row est un mot clé de VBA, remplace-le déjà par NoLigne ou autre chose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        buffer=MSComm1.Input
        DoEvents
        Do
            If Len(buffer)>0 Then 
                tampon = tampon + buffer
            endif
            buffer=MSComm1.Input
        Loop Until InStr(buffer, vbcr) <> 0
        NoLigne = NoLigne +1 
        Cells(NoLigne, 1) = tampon
    Mais là, tu ne recevras qu'un mot (de plusieurs caractères si c'est le cas.
    Il faudrait que tu trouves quel est le carractère reçu en fin de transmission afin de placer tout ça dans une boucle jusqu'à fin de transmission. Ainsi, tu pourrais placer un mot par ligne.
    J'ai écrit le code ainsi afin que tu puisses ajouter cette boucle.
    A+

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    J'ai trouvé une URL qui pourrait t'intéresser http://old-www.u-psud.fr/iut-cachan/...LE/TPserie.pdf
    J'ai également trouvé le caractère de fin de transmission, EOT (End of transmission) qui est le code Ascii 4.
    Si je reprends le code précédent, j'écrirais ça ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Buffer = ""
    Do While Buffer <> chr(4)
        buffer=MSComm1.Input
        DoEvents
        Do While InStr(buffer, vbcr) = 0 and InStr(buffer, chr(4)) = 0
            If Len(buffer) > 0 Then 
                tampon = tampon + buffer
            endif
            buffer=MSComm1.Input
            DoEvents
        Loop
        if InStr(buffer, chr(4)) <> 0 then exit do
        NoLigne = NoLigne +1 
        Cells(NoLigne, 1) = tampon
        tampon  = ""
    Loop
    Tu veux bien tester ?
    (Ajoute les déclarations)

    NB - il sera peut-être nécessaire que tu gères Xoff et Xon

  16. #16
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 96
    Points : 44
    Points
    44
    Par défaut reception sur RS232 en VBA
    Bonsoir,

    J'essaie de communiquer avec un Pic et un PC avec le port série en VBA.
    J'arrive à commander des sorties du PIC avec la fonction MSComm2.Output.
    J'arrive à envoyer des valeurs sur feuille excel.
    Je n'arrive pas à sauter une ligne dans la feuille excel pour chaque valeur envoyée.

    Dans le Pic (je fais une succession de printf("%2u\n\r",value);
    printf("%2u\n\r",value+1);....

    Voici mon code VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Private Sub CommandButton4_Click()
    MSComm2.InBufferCount = 0
      		MSComm2.Settings = "115200,n,8,1"
      		MSComm2.InputLen = 1024
      		MSComm2.InBufferSize = 2048
    MSComm2.PortOpen = True 'ouverture du port
        		MSComm2.Output = ("1")
         Noligne = 9
      Do
     DoEvents
     buffer = MSComm2.Input
     If Len(buffer) > 0 Then tampon = tampon & buffer: Cells(Noligne, 2) = tampon: Noligne = Noligne + 1:
     tampon = tampon & MSComm2.Input 
      Loop Until InStr(buffer, Chr(13))
                          MSComm2.PortOpen = False 'ouverture du port
     
    End Sub

    Si vous avez une idée, Merci d'avance

    CC

  17. #17
    Membre éprouvé
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Points : 1 191
    Points
    1 191
    Par défaut
    Bonsoir, Paul



    bon j'ai du mal à comprendre ton code, tu boucle jusqu'à trouver un caractére retour chariot ..? c'est bien cela ..? mais alors arrive tu à recevoir toutes tes lignes print...

  18. #18
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 96
    Points : 44
    Points
    44
    Par défaut Reception sur RS232 en VBA
    Bonjour,

    J'essaie toujours de recevoir par le port série des informations d'un PIC (9600b/s).
    Avec le pic, j'envoie 3 prénoms que je voudrais afficher dans 3 cellules successives.
    Dans les cellules, je récupère les 2 premiers caractères du prénom dans la cellule suivante la suite des caractéres et dans la dernier cellule j'ai les 3 prénoms.

    Cellule A9 : g, A10 :ger , A11: gerar ......A17:les 3 prénoms

    Avez vous réaliser ce type programme, avez vous des idées de programme ?

    Merci d'avance

    CC

Discussions similaires

  1. Liaison série avec une imprimante Imaje(S8)
    Par laeti23 dans le forum C#
    Réponses: 0
    Dernier message: 29/12/2008, 15h39
  2. Gestion de micro coupures ADSL avec VBA
    Par Yohann_x dans le forum VBA Access
    Réponses: 2
    Dernier message: 13/10/2007, 10h55
  3. liaison série avec interruption
    Par eight85 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 30/08/2007, 08h28
  4. Réponses: 4
    Dernier message: 30/03/2007, 16h27
  5. liaison Série avec kernell32
    Par Emcy dans le forum Windows
    Réponses: 8
    Dernier message: 31/08/2005, 08h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo