visual serie serial puertos puerto programa por para net manejo leer enviar datos comunicacion vba serial-port powerpoint com-interface

vba - serie - puertos com vb net



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

¿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 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.

Como 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?


La API de 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. Cómo realizar comunicaciones de puerto serie en VBA


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 = "?@@@@@@@@" 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: tal vez una mejor manera sea tener un puntero de personaje y una cantidad de caracteres, y cuando esos sean iguales establecerlos a cero.