【问题标题】:Read weight from a Fairbanks SCB-9000 USB Scale从费尔班克斯 SCB-9000 USB 秤读取重量
【发布时间】:2012-08-14 21:56:27
【问题描述】:

我正在尝试创建一个可执行文件,该可执行文件可以被调用并从 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;

    }

抱歉应该补充一下,我从这里使用 Mike Obrien 的 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;
            }
        }
    }
}

【问题讨论】:

  • 啊,我自己花了很多时间来解决这个问题。在修复项目后向项目提交拉取请求会很高兴..

标签: c# usb hid


【解决方案1】:

由于您并不总是返回某些内容,因此您将无法编译。根据错误消息,这就是您真正需要的。我找不到任何关于 HidDeviceHidDevices 的参考资料,所以我不能说这会绝对确定。

public HidDevice[] GetDevices()
{
    return HidDevices.Enumerate(0x0B67, 0x555E).Cast<HidDevice>().ToArray();
}

您必须添加这一行才能编译:

using System.Linq;

附带说明,获取 ReSharper。

【讨论】:

  • 关闭。如果错误确实是在抱怨Enumerate 返回IEnumerable(不是IEnumerable&lt;T&gt;),那么在转换ToArray 之前需要Cast&lt;HidDevice&gt;()
  • 实际上你还必须定义类型; HidDevices.Enumerate 显然创建了一个非泛型 IEnumerable,您必须使用 Cast() 或 OfType() 对其进行强类型化。
  • 感谢您的快速回复。不幸的是,上述建议没有奏效。错误是 HidDevice 不包含 Cast() 的定义。还有其他建议吗?你们需要看更多的代码吗?我从这里使用 HidLibrary:nuget.org/packages/hidlibrary
  • @user1599271:我安装了包并运行了这段代码。 .Cast&lt;HidDevice&gt; 这里是多余的。您描述的错误不能来自现在编写的此代码。请使用您正在使用的代码更新您的问题。
  • 对不起。拿出我是怎么拿到的,我发的时候没放回去。我尝试了几种不同的方法来做类似的事情,但没有奏效。以上是我在您发布后首先尝试的。
【解决方案2】:

想为此添加一些注释以帮助其他人。我专门查看代码中提到除法问题的 FIXME 注释。

我一直在使用 Mettler Toledo PS 系列秤、PS-60、PS-15 和 PS-90。在 HID 数据返回中,PS-15 的第三个元素返回 255,PS-60 和 PS-90 都返回 254。

使用校准砝码我发现 PS-15 需要除以 10 才能获得正确的重量,而 PS-60/90 需要除以 100。

【讨论】:

  • 添加一些解释,说明此答案如何帮助 OP 解决当前问题
猜你喜欢
  • 2018-09-21
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
相关资源
最近更新 更多