2012-04-16 19 views
6

Sto provando a collegarmi a una bilancia USB USB, Il codice si collega alla bilancia come scale.IsConnected si avvera, ma si blocca su scale.Read(250) dove 250 dovrebbe essere il timeout in millisecondi ma mai ritorno dal
LeggiHID USB si blocca su Read() in C#

sto usando il codice this filo tranne un cambio che è stato a causa della nuova versione di 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; 
    } 

sono riuscito a ottenere la scala lavorare, dare un'occhiata a risposta di Mike here

risposta

4

sono riuscito a ottenere il funzionamento scala, Nel mio callback che viene eseguito quando la bilancia restituisce i dati che stavo facendo Read che è una chiamata di blocco. Quindi è stato creato un deadlock, dovrebbe essere stato utilizzato solo ReadReport o Read dare un'occhiata all'esempio di Mike sotto il quale ha pubblicato 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

Sentitevi liberi per contrassegnare questo come accettata una volta che il sistema che consente :) –

+0

Dov'è il 'data' classe in cui si crea un'istanza di esso all'interno del metodo OnReport? –

+0

Questo è tutto il codice necessario, credo. è stato un po 'però – PUG