2012-04-16 9 views
6

Ich versuche, an eine digitale Waage anzuschließen, der Code wird an die Waage als scale.IsConnected geht in Erfüllung, aber hängt an scale.Read(250) wo 250 sollte das Timeout in Millisekunden sein, aber es nie Rückkehr von Read
USB HID hängt an Read() in C#

ich den Code aus this Thread mit einer Ausnahme Änderung verwenden, die auf die neue Version von Grunde war 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; 
    } 

ich es geschaffen, um die Waage zu bekommen zu arbeiten, gehen Antwort einen Blick auf Mikes here

Antwort

4

ich es geschafft, die Skala zum Laufen zu bringen, die in meinem Rückruf ausgeführt wird, wenn Maßstab Daten zurückgibt ich Read tat, die ein blockierenden Aufruf ist. So ein Deadlock wurde erstellt, sollte nur verwendet haben ReadReport oder Read werfen Sie einen Blick auf Mike Beispiel, unter dem er here veröffentlicht.

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

als angenommen Spüren Sie diese frei zu markieren, sobald das System Sie können :) –

+0

Wo ist der 'Data' Klasse, wo Sie eine Instanz davon innerhalb der Methode OnReport schaffen? –

+0

Das ist alles Code, den ich glaube. war schon eine Weile her – PUG