Fairbanks SCB-9000 USB スケールから呼び出して重量を返すことができる実行可能ファイルを作成しようとしています。異なるモデル スケール用のコードをいくつか見つけましたが、うまくいきません。私は特に次の方法に問題があります。エラーが表示されます:「型 'System.Collections.Generic.IEnumerable' を 'HidLibrary.HidDevice[]' に暗黙的に変換できません。」これをキャストする方法をいくつか試しましたが、うまくいきません。ここで何か提案がありますか、またはこの特定のスケール用にコードを書いたことがありますか?
ありがとうございました、
ロブ
問題のメソッドは次のとおりです。
public HidDevice[] GetDevices()
{
HidDevice[] hidDeviceList;
// Fairbanks Scale
hidDeviceList = HidDevices.Enumerate(0x0B67, 0x555E);
if (hidDeviceList.Length > 0)
return hidDeviceList;
}
申し訳ありませんが、ここからマイク オブライエンの HidLibrary を使用していることを追加する必要があります: http://nuget.org/packages/hidlibrary
完全なコードで更新...
これが私が使用しているコードです...
program.cs
using System;
using System.Threading;
using HidLibrary;
using Scale;
namespace ScaleReader
{
class Program
{
public static void Main(string[] args)
{
decimal? weight;
bool? isStable;
USBScale s = new USBScale();
s.Connect();
if (s.IsConnected)
{
s.GetWeight(out weight, out isStable);
s.DebugScaleData();
Console.WriteLine("Weight: {0:0.00} LBS", weight);
}
else
{
Console.WriteLine("No Scale Connected.");
}
s.Disconnect();
Thread.Sleep(500);
}
}
}
Scale.cs
using HidLibrary;
using System.Threading;
using System;
using System.Collections.Generic;
using System.Text;
namespace Scale
{
class USBScale
{
public bool IsConnected
{
get
{
return scale == null ? false : scale.IsConnected;
}
}
public decimal ScaleStatus
{
get
{
return inData.Data[1];
}
}
public decimal ScaleWeightUnits
{
get
{
return inData.Data[2];
}
}
private HidDevice scale;
private HidDeviceData inData;
public HidDevice[] GetDevices()
{
return HidDevices.Enumerate(0x0B67, 0x555E).Cast<HidDevice>().ToArray();
}
public bool Connect()
{
// Find a Scale
HidDevice[] deviceList = GetDevices();
if (deviceList.Length > 0)
return Connect(deviceList[0]);
else
return false;
}
public bool Connect(HidDevice device)
{
scale = device;
int waitTries = 0;
scale.OpenDevice();
// sometimes the scale is not ready immedietly after
// Open() so wait till its ready
while (!scale.IsConnected && waitTries < 10)
{
Thread.Sleep(50);
waitTries++;
}
return scale.IsConnected;
}
public void Disconnect()
{
if (scale.IsConnected)
{
scale.CloseDevice();
scale.Dispose();
}
}
public void DebugScaleData()
{
for (int i = 0; i < inData.Data.Length; ++i)
{
Console.WriteLine("Byte {0}: {1}", i, inData.Data[i]);
}
}
public void GetWeight(out decimal? weight, out bool? isStable)
{
weight = null;
isStable = false;
if (scale.IsConnected)
{
inData = scale.Read(250);
// Byte 0 == Report ID?
// Byte 1 == Scale Status (1 == Fault, 2 == Stable @ 0, 3 == In Motion, 4 == Stable, 5 == Under 0, 6 == Over Weight, 7 == Requires Calibration, 8 == Requires Re-Zeroing)
// Byte 2 == Weight Unit
// Byte 3 == Data Scaling (decimal placement)
// Byte 4 == Weight LSB
// Byte 5 == Weight MSB
// FIXME: dividing by 100 probably wont work with
// every scale, need to figure out what to do with
// Byte 3
weight = (Convert.ToDecimal(inData.Data[4]) +
Convert.ToDecimal(inData.Data[5]) * 256) / 100;
switch (Convert.ToInt16(inData.Data[2]))
{
case 3: // Kilos
weight = weight * (decimal?)2.2;
break;
case 11: // Ounces
weight = weight * (decimal?)0.625;
break;
case 12: // Pounds
// already in pounds, do nothing
break;
}
isStable = inData.Data[1] == 0x4;
}
}
}
}