Autor Tema: Dudas con detección de coneccion/desconeccion de dispositivo USB  (Leído 9872 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Bueno muchos dirán ......pero es algo muy sencillo de hacer 8) La verdad NO, hasta ahora no había tenido ningún tipo de problemas en el uso de la librería mcHID.dl, pero en el camino me he encontrado con dificultades bastante interesantes, una de las cuales voy a tratar de exponer ahora para que alguien que tenga más conocimiento de programación pueda ayudarme.

Lo que trato de descubrir es como detectar la conexión fisica de un dispositivo determinado al host o PC.
mi programa de aplicación tiene un botón en donde nosotros conectamos o desconectamos de manera manual el dispositivo , a su vez tenemos la facilidad de configurar el VID, PID y los tamaños de los buffers de entrada y salida.

Bueno como se ve en la inmágen podemos configurar los parámetros básicos del USB y tenemos un botón de conección / desconección.

Mi problema radica en cuanto yo desconecto el dispositivo de forma física , es decir desconecto el cable que une el dispositivo con el host ...dicha desconexion no es posible detectarla si el programa de aplicación no está conectado al handler....les muestro mi error..

yo en mi forma de buscar el error me di cuenta que la conexión se detecta mediante una interrupción que produce el dispositivo al enlazarse con el handler ...esta interrupción activa un flag o bandera y en la aplicación la activación de este flag nos indica o no la condición fisica en la que se encuentra nuestro dispositivo.

Paso a mostrarles el código que hace esto posible:
Código: vb.net
  1. Private Function WinProc(ByVal pHWnd As Integer, ByVal pMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
  2. If pMsg = WM_HID_EVENT Then
  3. Select Case wParam
  4.  
  5. ' HID device has been plugged message...
  6. Case Is = NOTIFY_PLUGGED
  7. HostForm.OnPlugged(lParam)
  8.  
  9. ' HID device has been unplugged
  10. Case Is = NOTIFY_UNPLUGGED
  11. HostForm.OnUnplugged(lParam)
  12.  
  13. ' controller has changed...
  14. Case Is = NOTIFY_CHANGED
  15. HostForm.OnChanged()
  16.  
  17. ' read event...
  18. Case Is = NOTIFY_READ
  19. HostForm.OnRead(lParam)
  20. End Select
  21.  
  22. End If
  23.  
  24. ' next...
  25. WinProc = CallWindowProc(FPrevWinProc, pHWnd, pMsg, wParam, lParam)
  26.  
  27. End Function
y su conjunto de flags o banderas definidas:

Private Const NOTIFY_PLUGGED As Short = 1 CONECCIÓN DEL DISPOSITIVO
Private Const NOTIFY_UNPLUGGED As Short = 2 DESCONECCIÓN DEL DISPOSITIVO
Private Const NOTIFY_CHANGED As Short = 3
Private Const NOTIFY_READ As Short = 4

En esta porción de código que defini anteriormente se encuentra la función que según la interrupción que produzca el dispositivo se activa alguna de las cuatro banderas....

Ahora el problema radica que estas interrupciones se producen solo cuando la aplicación está conectada al handler....y aqui muestro la función de conección:
Código: vb.net
  1. Public Function ConnectToHID(ByRef targetForm As Form) As Boolean
  2.         Dim pHostWin As Integer = targetForm.Handle.ToInt32
  3.         FWinHandle = pHostWin
  4.         pHostWin = hidConnect(FWinHandle)
  5.         FPrevWinProc = DelegateSetWindowLong(FWinHandle, GWL_WNDPROC, Ref_WinProc)
  6.         HostForm = targetForm
  7.     End Function
Por lo tanto si yo me conecto primero al handler ....si me detecta la conexion fisica o desconección del dispositivo. Miren la aplicación:


Ahora mi pregunta es si se puede detectar primero la conección al host..y luego conectarme...es decir que la aplicación haga un scaneo para ver si hay un dispositivo conectado al host y en funcion de esto conectarme al mismo o no....   :idea:
 
Les dejo los códigos fuente del programa y de la librería:

Código: vb.net
  1. Public Class Form1
  2.  
  3.     Dim VendorID As Short  ' Variable que contiene el ID del vendedor del producto USB.
  4.     Dim ProductID As Short ' Variable que contiene el ID del producto USB.
  5.     Dim phandle As Integer
  6.  
  7.     ' Declaración de Buffers de lectura / escritura.
  8.     Dim BufferInSize As Short ' Declaramos el tamaño del buffer de entrada.
  9.     Dim BufferOutSize As Short ' Declaramos el tamaño del buffer de salida.
  10.     Dim BufferIn(BufferInSize) As Byte ' Variable que contiene los datos de salida cuyo tamaño lo designa BufferInSize.
  11.     Dim BufferOut(BufferOutSize) As Byte ' Variable que contiene los datos de salida cuyo tamaño lo designa BufferOutSize
  12.  
  13.     Private Sub Hora_windows_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Hora_windows.Tick
  14.         StatusStrip1.Items(0).Text = DateTime.Now.ToLongTimeString() ' Mostramos la hora de Windows.
  15.     End Sub
  16.  
  17.     Private Sub SalirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SalirToolStripMenuItem.Click
  18.         Close() ' Cerramos la aplicación al presionar salir.
  19.         DisconnectFromHID() ' Desconectamos el dispositivo USB.
  20.     End Sub
  21.  
  22.     Private Sub AutorToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AutorToolStripMenuItem.Click
  23.         MessageBox.Show("Pograma de ejemplo Nº1 HID usando mcHID.dll" & vbLf & vbLf & "Autor: Moyano Jonathan." & vbLf & "Contacto: jonathan215@hotmail.com " & vbLf & vbLf & "http://www.forosdeelectronica.com" & vbLf & vbLf & "LICENCIA: FREEWARE", "", MessageBoxButtons.OK, MessageBoxIcon.Information) ' Leeme para el usuario.
  24.     End Sub
  25.  
  26.     Private Sub LeemeToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LeemeToolStripMenuItem.Click
  27.         MessageBox.Show("Programa de ejemplo Nº1 HID:" & vbLf & "Muestra una pantalla de configuración del puerto USB y" & vbLf & "también dentro de un cuadro nos muestra si el" & vbLf & "dispositivo está conectado o no.", "", MessageBoxButtons.OK, MessageBoxIcon.Information) ' Leeme para el usuario.
  28.  
  29.     End Sub
  30.  
  31.     Private Sub Conectar_dispositivo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Conectar_dispositivo.Click
  32.         If Conectar_dispositivo.Text = "DESCONECTAR DISPOSITIVO" Then
  33.             Conectar_dispositivo.Text = "CONECTAR DISPOSITIVO"
  34.             DisconnectFromHID() ' Desconectamos el dispositivo USB de la aplicación.
  35.             USB_estado.BackColor = Color.Red
  36.             debug.Items.Add("Dispositivo desconetado por el usuario.")
  37.             debug.Items.Add("Se puede deconectar el dispositivo del host de forma segura")
  38.         ElseIf Conectar_dispositivo.Text = "CONECTAR DISPOSITIVO" Then
  39.             ConnectToHID(Me) ' Enlazamos el dispositivo al programa de aplicación.
  40.             debug.Items.Add("Dispositivo:")
  41.             debug.Items.Add("VID:" & Hex(VendorID))
  42.             debug.Items.Add("PID:" & Hex(ProductID))
  43.             debug.Items.Add("IN_BUFFER: " & BufferInSize.ToString & " bytes.")
  44.             debug.Items.Add("IN_BUFFER: " & BufferOutSize.ToString & " bytes.")
  45.             Conectar_dispositivo.Text = "DESCONECTAR DISPOSITIVO"
  46.         End If
  47.  
  48.     End Sub
  49.     '**********************************************************************
  50.     ' En caso de que el formulario se cierre el dispositivo se desconecta.
  51.     '**********************************************************************
  52.     Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  53.         DisconnectFromHID()
  54.     End Sub
  55.  
  56.     '*****************************************************************
  57.     ' Un dispositivo USB ha sido conectado.
  58.     '*****************************************************************
  59.     Public Sub OnPlugged(ByVal pHandle As Integer)
  60.         If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) = ProductID Then
  61.             USB_estado.BackColor = Color.Green
  62.             debug.Items.Add("El dispositivo ha sido conectado")
  63.         End If
  64.     End Sub
  65.  
  66.     '*****************************************************************
  67.     ' Un dispositivo USB ha sido desconectado.
  68.     '*****************************************************************
  69.     Public Sub OnUnplugged(ByVal pHandle As Integer)
  70.         If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) = ProductID Then
  71.             hidSetReadNotify(hidGetHandle(VendorID, ProductID), False)
  72.             USB_estado.BackColor = Color.Red
  73.             debug.Items.Add("El dispositivo ha sido desconectado")
  74.         End If
  75.     End Sub
  76.  
  77.     '***********************************************************************
  78.     ' Llamada a Notificación de cambios en el controlador en caso
  79.     ' de que todos los dispositivos hallan sido conectados o desconectados.
  80.     '***********************************************************************
  81.     Public Sub OnChanged()
  82.         ' Toma el manejador del dispositivo en el cuál estemos interasados, luego
  83.         ' luego setea esta notificación a 1 - esto asegura que tengamos una lectura.
  84.         ' Se recibirán notificaciones siempre y cuando hayan datos para leer.
  85.         pHandle = hidGetHandle(VendorID, ProductID)
  86.         hidSetReadNotify(hidGetHandle(VendorID, ProductID), True)
  87.     End Sub
  88.  
  89.     '*****************************************************************
  90.     ' En un evento de lectura....
  91.     '*****************************************************************
  92.     Public Sub OnRead(ByVal pHandle As Integer)
  93.         If hidRead(pHandle, BufferIn(0)) Then
  94.  
  95.             ' Primero leemos el reportID, BufferIn(0)
  96.             ' Luego los demás bytes son los datos del microcontrolador...
  97.         End If
  98.     End Sub
  99.  
  100.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  101.         USB_estado.BackColor = Color.Blue
  102.         debug.Items.Clear() ' Limpiamos la pantalla de debug.
  103.         debug.Items.Add("Dispositivo aún no conectado")
  104.     End Sub
  105.  
  106.     Private Sub Vid_dispositivo_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Vid_dispositivo.TextChanged
  107.         VendorID = (Val(Vid_dispositivo.Text))
  108.     End Sub
  109.  
  110.     Private Sub Pid_dispositivo_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pid_dispositivo.TextChanged
  111.         ProductID = (Val(Pid_dispositivo.Text))
  112.     End Sub
  113.  
  114.     Private Sub In_USB_buffer_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles In_USB_buffer.TextChanged
  115.         BufferInSize = (Val(In_USB_buffer.Text))
  116.     End Sub
  117.  
  118.     Private Sub Out_USB_Buffer_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Out_USB_Buffer.TextChanged
  119.         BufferOutSize = (Val(Out_USB_Buffer.Text))
  120.     End Sub
  121.  
  122.     Public Sub WriteSomeData() ' Si hay un dato listo para enviar...
  123.         hidWriteEx(VendorID, ProductID, BufferOut(0))
  124.     End Sub
  125. End Class

Código: vb.net
  1. Imports System.Threading
  2. Imports System.Runtime.InteropServices
  3.  
  4.  
  5. Module HIDDLLInterface
  6.     ' this is the interface to the HID controller DLL - you should not
  7.     ' normally need to change anything in this file.
  8.     '
  9.     ' WinProc() calls your main form 'event' procedures - these are currently
  10.     ' set to..
  11.     '
  12.     ' MainForm.OnPlugged(ByVal pHandle as long)
  13.     ' MainForm.OnUnplugged(ByVal pHandle as long)
  14.     ' MainForm.OnChanged()
  15.     ' MainForm.OnRead(ByVal pHandle as long)
  16.  
  17.  
  18.     ' HID interface API declarations...
  19.     Declare Function hidConnect Lib "mcHID.dll" Alias "Connect" (ByVal pHostWin As Integer) As Boolean
  20.     Declare Function hidDisconnect Lib "mcHID.dll" Alias "Disconnect" () As Boolean
  21.     Declare Function hidGetItem Lib "mcHID.dll" Alias "GetItem" (ByVal pIndex As Integer) As Integer
  22.     Declare Function hidGetItemCount Lib "mcHID.dll" Alias "GetItemCount" () As Integer
  23.     Declare Function hidRead Lib "mcHID.dll" Alias "Read" (ByVal pHandle As Integer, ByRef pData As Byte) As Boolean
  24.     Declare Function hidWrite Lib "mcHID.dll" Alias "Write" (ByVal pHandle As Integer, ByRef pData As Byte) As Boolean
  25.     Declare Function hidReadEx Lib "mcHID.dll" Alias "ReadEx" (ByVal pVendorID As Integer, ByVal pProductID As Integer, ByRef pData As Byte) As Boolean
  26.     Declare Function hidWriteEx Lib "mcHID.dll" Alias "WriteEx" (ByVal pVendorID As Integer, ByVal pProductID As Integer, ByRef pData As Byte) As Boolean
  27.     Declare Function hidGetHandle Lib "mcHID.dll" Alias "GetHandle" (ByVal pVendoID As Integer, ByVal pProductID As Integer) As Integer
  28.     Declare Function hidGetVendorID Lib "mcHID.dll" Alias "GetVendorID" (ByVal pHandle As Integer) As Integer
  29.     Declare Function hidGetProductID Lib "mcHID.dll" Alias "GetProductID" (ByVal pHandle As Integer) As Integer
  30.     Declare Function hidGetVersion Lib "mcHID.dll" Alias "GetVersion" (ByVal pHandle As Integer) As Integer
  31.     Declare Function hidGetVendorName Lib "mcHID.dll" Alias "GetVendorName" (ByVal pHandle As Integer, ByVal pText As String, ByVal pLen As Integer) As Integer
  32.     Declare Function hidGetProductName Lib "mcHID.dll" Alias "GetProductName" (ByVal pHandle As Integer, ByVal pText As String, ByVal pLen As Integer) As Integer
  33.     Declare Function hidGetSerialNumber Lib "mcHID.dll" Alias "GetSerialNumber" (ByVal pHandle As Integer, ByVal pText As String, ByVal pLen As Integer) As Integer
  34.     Declare Function hidGetInputReportLength Lib "mcHID.dll" Alias "GetInputReportLength" (ByVal pHandle As Integer) As Integer
  35.     Declare Function hidGetOutputReportLength Lib "mcHID.dll" Alias "GetOutputReportLength" (ByVal pHandle As Integer) As Integer
  36.     Declare Sub hidSetReadNotify Lib "mcHID.dll" Alias "SetReadNotify" (ByVal pHandle As Integer, ByVal pValue As Boolean)
  37.     Declare Function hidIsReadNotifyEnabled Lib "mcHID.dll" Alias "IsReadNotifyEnabled" (ByVal pHandle As Integer) As Boolean
  38.     Declare Function hidIsAvailable Lib "mcHID.dll" Alias "IsAvailable" (ByVal pVendorID As Integer, ByVal pProductID As Integer) As Boolean
  39.  
  40.     ' windows API declarations - used to set up messaging...
  41.  
  42.     Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Integer, ByVal hwnd As Integer, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
  43.     Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
  44.                                           (ByVal hwnd As Integer, ByVal nIndex As Integer, ByVal dwNewLong As Integer) As Integer
  45.  
  46.     Delegate Function SubClassProcDelegate(ByVal hwnd As Integer, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
  47.     Public Declare Function DelegateSetWindowLong Lib "USER32.DLL" Alias "SetWindowLongA" _
  48.                                            (ByVal hwnd As Integer, ByVal attr As Integer, ByVal lval As SubClassProcDelegate) As Integer
  49.  
  50.  
  51.     ' windows API Constants
  52.     Public Const WM_APP As Integer = 32768
  53.     Public Const GWL_WNDPROC As Short = -4
  54.  
  55.     ' HID message constants
  56.     Private Const WM_HID_EVENT As Decimal = WM_APP + 200
  57.     Private Const NOTIFY_PLUGGED As Short = 1
  58.     Private Const NOTIFY_UNPLUGGED As Short = 2
  59.     Private Const NOTIFY_CHANGED As Short = 3
  60.     Private Const NOTIFY_READ As Short = 4
  61.  
  62.     ' local variables
  63.     Private FPrevWinProc As Integer ' Handle to previous window procedure
  64.     Private FWinHandle As Integer ' Handle to message window
  65.     Private Ref_WinProc As New SubClassProcDelegate(AddressOf WinProc)
  66.     Private HostForm As Object
  67.  
  68.     ' Set up a windows hook to receive notification
  69.     ' messages from the HID controller DLL - then connect
  70.     ' to the controller
  71.     Public Function ConnectToHID(ByRef targetForm As Form) As Boolean
  72.         Dim pHostWin As Integer = targetForm.Handle.ToInt32
  73.         FWinHandle = pHostWin
  74.         pHostWin = hidConnect(FWinHandle)
  75.         FPrevWinProc = DelegateSetWindowLong(FWinHandle, GWL_WNDPROC, Ref_WinProc)
  76.         HostForm = targetForm
  77.     End Function
  78.  
  79.     ' Unhook from the HID controller and disconnect...
  80.     Public Function DisconnectFromHID() As Boolean
  81.         DisconnectFromHID = hidDisconnect
  82.         SetWindowLong(FWinHandle, GWL_WNDPROC, FPrevWinProc)
  83.     End Function
  84.  
  85.  
  86.     ' This is the procedure that intercepts the HID controller messages...
  87.  
  88.     Private Function WinProc(ByVal pHWnd As Integer, ByVal pMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
  89.         If pMsg = WM_HID_EVENT Then
  90.             Select Case wParam
  91.  
  92.                 ' HID device has been plugged message...
  93.                 Case Is = NOTIFY_PLUGGED
  94.                     HostForm.OnPlugged(lParam)
  95.  
  96.                     ' HID device has been unplugged
  97.                 Case Is = NOTIFY_UNPLUGGED
  98.                     HostForm.OnUnplugged(lParam)
  99.  
  100.                     ' controller has changed...
  101.                 Case Is = NOTIFY_CHANGED
  102.                     HostForm.OnChanged()
  103.  
  104.                     ' read event...
  105.                 Case Is = NOTIFY_READ
  106.                     HostForm.OnRead(lParam)
  107.             End Select
  108.  
  109.         End If
  110.  
  111.         ' next...
  112.         WinProc = CallWindowProc(FPrevWinProc, pHWnd, pMsg, wParam, lParam)
  113.  
  114.     End Function
  115. End Module

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Dudas con detección de coneccion/desconeccion de dispositivo USB
« Respuesta #1 en: 17 de Julio de 2010, 14:37:59 »
como te has tomado el tiempo de tantos gráficos y esas cosas, te copio lo que te comentaba por otros lados  :mrgreen:

como te comenté en otros hilos, no uso VB para programar, si no que uso VC, pero creo que la programacion bajo windows usando la programacion por mensajes, uso de la funcion DlgProc() es muy similar chusmiando un poco tu código.

Yo tengo un programa que lo uso con un dispositivo HID, difiere un poco del tuyo porque la conexion la hago automatica, es decir, no tengo un boton que sea conectar o desconectar, sino que si enchufo el dispositivo en el puerto automaticamente se inicia el proceso que quiero, en mi caso es iniciar la comunicacion PC-Dispositivo.

Lo que yo uso es el mensaje WM_DEVICECHANGE, veo que tu usas el WM_HID_EVENT, quizas sea el mismo, no lo se. Tampoco sabria decirte si en VB recibirias ese mensaje, aunque creo que si te servirá. http://msdn.microsoft.com/en-us/library/aa363480%28VS.85%29.aspx
El WM_DEVICECHANGE sirve para cuarlquier dispositivo que se detecte en conexion o desconeccion.
Cuando detectas este mensage lo que haces es intentar tener acceso al dispositivo, si es satisfactorio, es porque se ha conectado, si falla es porque se ha desconectado.

Te adjunto parte del código de la función DlgProc(), solo la parte que te interesaria para no distraer, jejejeje. Esta bien comentado para que lo puedas seguir. Puede que cuando le saque lo que distrae me allá comido alguna llave o algo de eso, creo que no.  :mrgreen:

Código: [Seleccionar]
BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
char msgstring[256]; // generic message string for the list box

static HANDLE HidDevHandle; // Handle to HID device
static BOOLEAN HidAttached;
static HDEVNOTIFY *hDevNotify; // notification results

// parse windows messages sent to the dialog box
switch(uMsg)
{

// dialog box initialization
case WM_INITDIALOG:
{
// Ver si el dispositivo esta conectado
HidAttached = bOpenHidDevice(&HidDevHandle, VID, PID);

if(HidAttached == TRUE)
{
sprintf(msgstring, "ATTACH: Dispositivo conectado!");
SendMessage( hListBox, LB_INSERTSTRING, 0, (LPARAM) msgstring);
CloseHandle(&HidDevHandle);
endthread = FALSE;
// TMesasure es el thread donde se hace la comunicacion
_beginthread(TMeasure, 0, hwndDlg);
}

// Set up notificaciones del dispositivo HID
if( bHidDeviceNotify(hwndDlg, hDevNotify) == FALSE)
MessageBox(hwndDlg, "Fallo en Registrar Notificacion del Dispositivo", "ERROR", MB_ICONSTOP);

break;
}

// Cuan cualquier dispositivo es conectado o desconectado
// la aplicacion recive un mensage WM_DEVICECHANGE.
// La aplicacion luego necesita intnetar abrir un handle al dispositivo.
// Si es satisfactorio, el dispositivo es conectado.
// Si falla, el dispositivo es desconectado.
case WM_DEVICECHANGE:
{

// intenta abrir un handle al dispositivo
HidAttached = bOpenHidDevice(&HidDevHandle, VID, PID);
CloseHandle(HidDevHandle);


// tomar accion segun el mensaje
switch(LOWORD(wParam))
{
// HID recibido o conectado
case DBT_DEVICEARRIVAL:
{
// si es conectado, comenzar la comunicacion
if(endthread == TRUE && HidAttached == TRUE)
{
endthread = FALSE;
_beginthread(TMeasure, 0, hwndDlg);
sprintf(msgstring, "Dispositivo conectado!");
SendMessage( hListBox, LB_INSERTSTRING, 0, (LPARAM) msgstring);
}
break;
}

// HID removido o desconectado
case DBT_DEVICEREMOVECOMPLETE:
{
// si falla, detener la comunicacion
if(endthread == FALSE && HidAttached == FALSE)
{
// finalizar el IN endpoint
endthread = TRUE;
sprintf(msgstring, "HID desconectado!");
SendMessage( hListBox, LB_INSERTSTRING, 0, (LPARAM) msgstring);
}

break;
}


// HID Device Change - Pareciera que Win2k tiende a utilizar este mensage
// en ves de los dos anteriores.
case DBT_DEVNODES_CHANGED:
{

// si es satisfactorio comenzar la comunicacion
if(endthread == TRUE && HidAttached == TRUE)
{
endthread = FALSE;
_beginthread(TMeasure, 0, hwndDlg);
sprintf(msgstring, "HID conectado!");
SendMessage( hListBox, LB_INSERTSTRING, 0, (LPARAM) msgstring);
}

// si falla detener la comunicacion
else if(endthread == FALSE && HidAttached == FALSE)
{
// finalizar el IN endpoint
endthread = TRUE;
sprintf(msgstring, "HID desconectado!");
SendMessage( hListBox, LB_INSERTSTRING, 0, (LPARAM) msgstring);
}

break;
}


default:
break;
}

break;
}

case WM_CLOSE:
{
// detener la comunicacion
endthread = TRUE;

// esperar a que se detenga la comunicacion
if(TMThreadActive == TRUE)
{
PostMessage(hwndDlg, WM_CLOSE, 0, 0);
break;
}
// finalizar las notificaciones de plug/unplug del HID
UnregisterDeviceNotification( hDevNotify );

// finalizar el dialogo de ventana
EndDialog(hwndDlg, 0);
break;
}

default:
break;
}

return FALSE;
}

Creo que con eso te funcionará, no le veo sentido el uso de los flag NOTIFY_...

Otra diferencia es que yo no uso una libreria, sino que uso el DDK de Windows

Código: [Seleccionar]
extern "C" {
#include <../../src/hid/inc/hidsdi.h> // note: part of Windows DDK
#include <../../src/hid/inc/hidpi.h> // note: also part of Windows DDK
}

no creo que eso influya en mucho.

Saludos
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Dudas con detección de coneccion/desconeccion de dispositivo USB
« Respuesta #2 en: 17 de Julio de 2010, 15:09:42 »
Muchas gracias willynovi voy a estudiar tu código que la verdad por lo comentado que está no me a resultar nada dificil  :-/ :-/

Ahora el tema es que me gustaría tenerlo tambien en VB.NET para poder estudiar el funcionamiento en ambos lenguajes..quedará estudiar  :mrgreen:

Ahora voy a hacer una pequeña aplicación de prueba para ver el funcionamiento de lo que me pusiste      :-/