2009-02-20 33 views
6

¿Cuál es la mejor manera de acceder a un puerto serie desde VBA?¿Cuál es la mejor forma de acceder a un puerto serie desde VBA?

Necesito que algunos de nuestros representantes de ventas puedan enviar una cadena simple sobre el puerto serie desde un botón de acción en PowerPoint. Normalmente no uso VBA, especialmente para algo como esto. Normalmente lo convertiría en una aplicación de algún tipo, pero en realidad no creo que la idea sea tan mala. Será una herramienta útil para que puedan hacer una demostración de este dispositivo mientras están en un proyector y hablando con otros vendedores y personas no técnicas. Además, este técnico de ventas no tendrá problemas para realizar pequeñas modificaciones en la presentación de VBA o PowerPoint, pero no le irá tan bien con la recompilación de una aplicación .NET.

Sé que podríamos hacerlo a través de un archivo de proceso por lotes desde la presentación de la acción, pero eso no me hace muy feliz. Me imagino que probablemente podríamos acceder a un objeto COM y ejecutar desde allí, pero una vez más, no estoy al tanto de las últimas y mejores bibliotecas para usar en VBA, y también sería bueno obtener un pequeño manual rápido sobre cómo abrir fácilmente, envía y cierra la conexión.

Dado que esto tendrá que ejecutarse en computadoras de varias personas, sería bueno si fuera fácilmente transportable a otras máquinas. Debería poder decir que tiene que ejecutarse en Office 2007 y Windows XP. La compatibilidad con cualquier otra cosa sería una buena ventaja.

¿Cómo debo manejar esto? ¿Algún buen consejo o trucos? Recomendaciones de la biblioteca?

Respuesta

11

La API Win32 maneja el puerto serie como un archivo. Puede acceder directamente a los puertos serie llamando a estas funciones API desde VBA. Tuve que hacer esto para una vieja aplicación .NET pero VBA no es diferente.

En lugar de hacérselo en este sitio, aquí hay una referencia que he colgado a lo largo de los años. How to perform serial port communications in VBA

+0

+1 Para el sitio que tiene un ejemplo de trabajo. – 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 

Esto funciona para mí. No estoy seguro de si el OPEN realmente configura la velocidad en baudios, ya que utilicé TeraTerm por primera vez. Mi puerto COM es una conexión USB a un kit de prototipos BASYS3. Está arrojando caracteres a 9600, registros de 36 caracteres que terminan con CR. Puedo enviar comandos de 9 caracteres al azar. En el código anterior, genero estas cadenas de comandos cada vez que recibo una nueva línea. La forma en que elegí qué personaje enviar es un poco torpe: quizás una mejor manera sea tener un puntero de carácter y una cantidad de caracteres, y cuando estos igualen los dos a cero.

+0

Si el puerto COM se abre como aleatorio, parece que EOF le dice cuándo tiene un personaje para recibir. Eso significa que uno puede recibir un carácter nulo. EOF dice que no hay personajes esperando. –

+0

La configuración de la velocidad en baudios en OPEN no parece funcionar. Pero Shell "mode.com com7: 9600, n, 8,1" funciona, si espera un segundo antes de abrir OPEN "COM7:" Esto es todo Excel 2010. –

+0

Actualización en EOF con puerto COM como aleatorio: se ve como EOF no cambia con el carácter recibido, pero refleja el estado del GET. Entonces, después de GET # 1, vByte, EOF será FALSE cuando vByte sea válido. –

Cuestiones relacionadas