Hola Meta, recibe un saludo y aprovecho para ver si me puedes enterar sobre lo que comentaste:
¿Te vale par un puerto serie? Porque el USB nadie lo domina por aquí muy bien del todo.
Tenia entendido que en el tema que nuestro compañero Moyano inicio:
https://www.forosdeelectronica.com/f24/control-dispositivos-traves-modulo-usb-pic18f2550-17458/ ya estaba mas que solucionado el asunto USB HID y visual .net, y que tu también lo tenias resuelto, ya que vi inclusive algún post donde tocan el tema
https://www.forosdeelectronica.com/f26/usb-hid-hidcomm-exe-64-bits-win-7-win-vista-72232/ , y di por hecho el dominio del USB, yo por mi parte, que trato de programar todo en lenguaje Basic, desde los microcontroladores; "IDE proton compiler" y desde la pc; "Visual Basic .net 2010", vengo resolviendo la comunicación USB-HID por medio de la libreria "HIDLibrary.dll" que descargue de
https://github.com/mikeobrien/HidLibrary y que desde aquí aprovecho a agradecer al desarrollador Mike O'Brien por su excelente librería.
Con esta librería he encontrado una simplificación estupenda para escribir mis programas VB.net, aun cuando siempre compilo en 32 bits, los programas funcionan perfecto en 64 bits incluyendo el nuevo windows 8 (32 y 64 bits) y hasta en el ya saliente Windows XP, el único requisito para que todo funcione ok es tener el Netframework mas reciente, que obvio que si instalas Visual Basic .net, pues ya lo tendrás, lo comento para cuando se tiene que distribuir la aplicación. Por el lado de la DLL (HIDLibrary.dll) solo se requiere que este presente el archivo en el mismo directorio donde esta la aplicación o el clásico \windows\system32\.
De cualquier manera dejo una sencillisima aplicación en VB.net 2010, que no hace otra cosa que prender un led o apagarlo (enviar un buffer) y mostrar el contenido de un puerto (recibir buffer). No voy a adentrarme en diagramas, explicaciones extensas del protocolo ya que esta mas que documentado en el Post de Moyano, que por cierto le envió un saludo; solo deseaba tocar el asunto de Visual Basic.net, eso si les aseguro que con esta misma librería (HIDLibrary.dll) he podido tener comunicación con cualquier dispositivo HID, ya sea un Microchip, Un Atmel, Un mouse, un teclado, etc, etc, que sea HID.
Ojala sirva mi "aportación" creo que viene lo suficientemente documentado el programa como para realizar un manual...reciban un cordial saludo.
PHP:
Imports HIDLibrary ' se importan las funciones de la libreria HIDLibrary.dll y a su vez tendremos que referenciarla via el Menu; Proyecto>Agregar Referencia
Imports System.Threading 'importamos el "engarzado" de las funciones de la libreria, para que esten disponibles en nuestro programa
Public Class Cibertlan_HID
Dim HidDeviceList As HIDLibrary.HidDevice() ' Es la Variable que indicara si hay tarjetas HID en nuestro sistema (windows)
Dim Cibertlan As HidDevice ' Esta variable nos sirve para dar un nombre a nuestra tarjeta cuando este reconocida por el programa, yo usare Cibertlan
Dim EntradaDatos As HidDeviceData ' esta variable contendra y manejara el buffer de entrada de la conexion USB de nuestra tarjeta
Dim SalidaDatos(8) As Byte ' La variable Salidadatos contendra el buffer que sera enviado a la conexion USB de nuestra tarjeta
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick 'esta subrutina es un timer activo cada 100 ms
HidDeviceList = HidDevices.Enumerate(&H1781, &H7D0) ' Enumeramos nuestro dispositivo en base al Vid y Pid de nuestra tarjeta
If HidDeviceList.Length > 0 Then 'si existe cuando menos un dispositivo con el Vid y Pid entonces,
Cibertlan = HidDeviceList(0) 'tomamos el primer dispositivo encontrado y le asignamos un nombre, en este caso "Cibertlan"
' Dentro del siguiente If (si es valido) se Verifica si la tarjeta esta conectada y reconocida por Windows,
' ademas se Transfieren los buffers de salida y de entrada
If Cibertlan.IsConnected Then ' Preguntamos si la tarjeta esta conectada y si es asi:
Conecta.FillColor = Color.Green ' Cambiamos el color de nuestro indicador de conexion a Verde
Enciende.Enabled = True ' Habilitamos el boton de comando "Enciende"
Apaga.Enabled = True ' Habilitamos el boton de comando "Apaga"
Cibertlan.Write(SalidaDatos) ' se transfiere el Buffer de salida desde la variable SalidaDatos hacia nuestra tarjeta USB
EntradaDatos = Cibertlan.Read() ' se Transfiere el Buffer desde nuestra tarjeta USB en la variable EntradaDatos
Thread.Sleep(10) ' Hacemos una pausa de 10 milisegundos para esperar que las operaciones de intercambio se completen.
Buferin.Text = EntradaDatos.Data(1) 'aqui en este ejemplo, veremos reflejado el buffer(1) que viene desde nuestra tarjeta usb en el textbox "buferin"
End If
Else ' Si no se detecto la tarjeta se deshabilitan los botones y se pone en rojo el indicador de conexion
Conecta.FillColor = Color.Red ' cambiamos el color de nuestro indicador de conexion a Rojo
Enciende.Enabled = False ' Deshabilitamos el boton de comando "Enciende"
Apaga.Enabled = False ' Deshabilitamos el boton de comando "Apaga"
End If
End Sub
Private Sub Enciende_Click(sender As System.Object, e As System.EventArgs) Handles Enciende.Click
SalidaDatos(0) = 0 ' se coloca un cero en la primera variable del buffer nota.-El buffer (0) se utilza para manejo de errores
SalidaDatos(1) = 1 ' Escribimos un "1" en el buffer(1) que en su momento se vera refeljado en el buffer de nuestra tarjeta.
End Sub
Private Sub Apaga_Click(sender As System.Object, e As System.EventArgs) Handles Apaga.Click
SalidaDatos(0) = 0 ' se coloca un cero en la primera variable del buffer nota.-El buffer (0) se utilza para manejo de errores
SalidaDatos(1) = 0 ' Escribimos un "O" en el buffer(1) que en su momento se vera reflejado en el buffer de nuestra tarjeta.
End Sub
End Class