2012-04-16 16 views
6

Próbuję połączyć się ze skalą cyfrową USB, Kod łączy się ze skalą jako scale.IsConnected spełnia się, ale zawiesza się na scale.Read(250) gdzie 250 powinno być przekroczeniem czasu w milisekundach, ale nigdy powrót z Czytaj
USB HID wisi na Odczyt() w C#

Używam kod z this wątku wyjątkiem jednej zmianie, co było spowodowane nowej wersji 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; 
    } 

udało mi się dostać na skalę działa, spójrz na odpowiedź Mike'a here

Odpowiedz

4

udało mi się dostać pracę skalę, W moim zwrotnego czyli gdy skala zwraca dane robię Read który jest wywołanie blokowanie. Tak więc powstał impas, powinien był tylko użyć ReadReport lub Read spojrzeć na przykład Mike'a, poniżej którego opublikował 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

Zapraszam oznaczyć to jako zaakceptowane gdy system pozwala :) –

+0

Gdzie jest 'Data' klasa gdzie utworzyć instancję go wewnątrz metody OnReport? –

+0

To wszystko, czego potrzebuję. jednak od jakiegoś czasu – PUG