2009-02-20 5 views
6

Quelle est la meilleure façon d'accéder à un port série à partir de VBA?Quelle est la meilleure façon d'accéder à un port série à partir de VBA?

J'ai besoin de certains de nos commerciaux pour pouvoir envoyer une chaîne simple sur le port série à partir d'un bouton d'action dans PowerPoint. Je n'utilise pas couramment VBA, en particulier pour quelque chose comme ça. Normalement, je voudrais en faire une application, mais je ne pense pas que l'idée soit si mauvaise. Ce sera un outil pratique pour eux de démo de cet appareil avec un projecteur et de parler à d'autres vendeurs et des personnes non techniques. En outre, ce vendeur n'aura aucun problème à faire de petites modifications à la présentation VBA ou PowerPoint, mais ne ferait pas aussi bien avec la recompilation d'une application .NET.

Je sais que nous pourrions le faire à travers un fichier batch exécuté à partir de la présentation sur l'action, mais cela ne me rend pas très heureux. Je pense que nous pourrions probablement accéder à un objet COM et l'exécuter à partir de là, mais je ne suis pas encore au courant des dernières et meilleures bibliothèques à utiliser dans VBA, et il serait également intéressant d'avoir un petit aperçu de la façon d'ouvrir facilement envoyer et fermer la connexion.

Étant donné que cela devra être exécuté sur plusieurs ordinateurs, il serait bon qu'il soit facilement transportable vers d'autres machines. Je devrais pouvoir dire qu'il doit fonctionner sur Office 2007 et Windows XP. Compatibilité avec toute autre chose serait un bon bonus si.

Comment dois-je procéder pour gérer cela? De bons conseils ou astuces? Recommandations de la bibliothèque?

Répondre

11

L'API Win32 gère le port série en tant que fichier. Vous pouvez accéder directement aux ports série en appelant ces fonctions API depuis VBA. Je devais le faire pour une ancienne application .NET mais VBA n'est pas différent.

Plutôt que de le faire pour vous sur ce site, voici une référence sur laquelle j'ai travaillé pendant des années. How to perform serial port communications in VBA

+0

+1 Pour le site ayant un exemple de travail. – Oorang

0
Sub Stinky() 
Dim COM_Byte As Byte 
Dim Received_Lines As Long 
Dim Input_Buffer As String 
Dim Output_Buffer As String 
Dim Chars2Send As Long 
Dim CharsRemaining As Long 
Dim lfsr As Long 
    Open "COM7:9600,N,8,1" For Random As #1 Len = 1 
    Input_Buffer = "" 
    CharsRemaining = 0 
    Do 
    Get #1, , COM_Byte 
    If COM_Byte Then 
     If COM_Byte = 13 Then   ' look for CR line termination 
      Debug.Print Input_Buffer, Now ' print it 
      Input_Buffer = ""    ' and clear input buffer 
     ' generate some output (9 characters) 
      lfsr = &H3FFFFFFF - 2^(Received_Lines And 15) 
      Output_Buffer = "[email protected]@@@@@@@" 
      Chars2Send = 9 
      CharsRemaining = 9 
      For j = 0 To 2 
       Mid(Output_Buffer, 2 + j, 1) = Chr(Asc(Mid(Output_Buffer, 2 + j, 1)) + (31 And Int(lfsr/32^(2 - j)))) 
      Next j 
      Debug.Print Output_Buffer 
     ' show what I generated 
      Received_Lines = Received_Lines + 1 ' keep track of received line count 
     Else 
      Input_Buffer = Input_Buffer & Chr(COM_Byte) ' assemble output buffer 
     ' process any characters to send 
      If CharsRemaining Then 
       CharsRemaining = CharsRemaining - 1 
       COM_Byte = Asc(Mid(Output_Buffer, Chars2Send - CharsRemaining, 1)) 
       Put #1, , COM_Byte 
      End If 
     End If 
    End If 
    DoEvents 
    Loop 
    Close 
End Sub 

Cela fonctionne pour moi. Je ne suis pas sûr que l'OPEN configure réellement la vitesse de transmission, comme j'ai d'abord utilisé TeraTerm. Mon port COM est une connexion USB à un kit de prototypage BASYS3. Il crache des caractères à 9600, enregistrements de 36 caractères se terminant par CR. Je peux envoyer au hasard des commandes de 9 caractères. Dans le code ci-dessus, je génère ces chaînes de commande chaque fois que j'ai reçu une nouvelle ligne. La façon dont j'ai choisi le caractère à envoyer est un peu maladroite: peut-être un meilleur moyen est d'avoir un pointeur de caractère et un nombre de caractères, et quand ceux-ci vont égaux pour les mettre à zéro.

+0

Si le port COM est ouvert au hasard, il semble que EOF vous indique quand vous avez un caractère à recevoir. Cela signifie que l'on peut recevoir un caractère nul. EOF dit qu'il n'y a pas de caractères en attente. –

+0

La définition du débit en bauds en OPEN ne semble pas fonctionner. Mais Shell "mode.com com7: 9600, n, 8,1" fonctionne, si vous attendez une seconde avant de faire l'OPEN "COM7:" Ceci est tout Excel 2010. –

+0

Mise à jour sur EOF avec le port COM comme aléatoire: Il semble comme EOF ne change pas avec le caractère reçu, mais reflète le statut du GET. Donc, après GET # 1, vByte, EOF sera FALSE lorsque vByte est valide. –

Questions connexes