2012-04-16 23 views
6

Estoy tratando de conectarme a una báscula digital USB, el código se conecta a la escala como scale.IsConnected se hace realidad, pero se cuelga en scale.Read(250) donde 250 debería ser el tiempo de espera en milisegundos pero nunca Leer regrese de
USB HID se bloquea en Read() en C#

estoy usando el código de this hilo, excepto un cambio que era debido a la nueva versión de Mike O Brien's HID Library

public HidDevice[] GetDevices() 
    { 
     HidDevice[] hidDeviceList; 


     // Metler Toledo 
     hidDeviceList = HidDevices.Enumerate(0x0eb8).ToArray(); 
     if (hidDeviceList.Length > 0) 
    return hidDeviceList; 

     return hidDeviceList; 
    } 

he conseguido la escala de trabajo, echar un vistazo a la respuesta de Mike here

Respuesta

4

que logró conseguir el funcionamiento de la escala, En mi devolución de llamada que se ejecuta cuando se escala devuelve los datos que estaba haciendo Read que es una llamada de bloqueo. Así que se creó un interbloqueo, debería haber utilizado ReadReport o Read, eche un vistazo al ejemplo de Mike a continuación, que publicó here.

using System; 
using System.Linq; 
using System.Text; 
using HidLibrary; 

namespace MagtekCardReader 
{ 
    class Program 
    { 
     private const int VendorId = 0x0801; 
     private const int ProductId = 0x0002; 

     private static HidDevice _device; 

     static void Main() 
     { 
      _device = HidDevices.Enumerate(VendorId, ProductId).FirstOrDefault(); 

      if (_device != null) 
      { 
       _device.OpenDevice(); 

       _device.Inserted += DeviceAttachedHandler; 
       _device.Removed += DeviceRemovedHandler; 

       _device.MonitorDeviceEvents = true; 

       _device.ReadReport(OnReport); 

       Console.WriteLine("Reader found, press any key to exit."); 
       Console.ReadKey(); 

       _device.CloseDevice(); 
      } 
      else 
      { 
       Console.WriteLine("Could not find reader."); 
       Console.ReadKey(); 
      } 
     } 

     private static void OnReport(HidReport report) 
     { 
      if (!_device.IsConnected) { return; } 

      var cardData = new Data(report.Data); 

      Console.WriteLine(!cardData.Error ? Encoding.ASCII.GetString(cardData.CardData) : cardData.ErrorMessage); 

      _device.ReadReport(OnReport); 
     } 

     private static void DeviceAttachedHandler() 
     { 
      Console.WriteLine("Device attached."); 
      _device.ReadReport(OnReport); 
     } 

     private static void DeviceRemovedHandler() 
     { 
      Console.WriteLine("Device removed."); 
     } 
    } 
} 
+1

dude en para marcar esto como aceptada una vez que el sistema le permite –

+0

:) ¿Dónde está el 'Data' clase en la que se crea una instancia de la misma dentro del método OnReport? –

+0

Esto es todo el código necesario, creo. sido un tiempo aunque – PUG

Cuestiones relacionadas