【问题标题】:Reading a range of output from USB device with LibUSB使用 LibUSB 从 USB 设备读取一系列输出
【发布时间】:2015-04-24 20:36:46
【问题描述】:

我正在开发一个与通过 USB 连接的设备进行通信的程序。当我的程序读入从设备发送的数据(例如,按下按钮)时,它以字节数组的形式发送。我将键值对存储为按钮按下字节数组的字典和按钮名称的字符串,只要按下它就会显示。这个设备也有发送字节数组的滑块,但它有一个完整的范围,每个滑块是数组中不同的数字

{ 3, 0, 0, 0, FF, 0, 0, 0 }

范围从 00 到 FF 十六进制,我将其转换为十进制。

byte[] slider1rangeLower = { 3, 0, 0, 0, 00, 0, 0, 0 }
byte[] slider1rangeUpper = { 3, 0, 0, 0, 255, 0, 0, 0 }
byte[] slider2rangeLower = { 3, 0, 0, 00, 0, 0, 0, 0 }
byte[] slider2rangeUpper = { 3, 0, 0, 255, 0, 0, 0, 0 }

我需要知道正在使用什么滑块,因此 0-255 之间的每个值都以“slider1”或任何名称出现。有没有办法为一个对象存储整个范围的值,而不是为每个滑块创建 256 个条目?

【问题讨论】:

  • 如果他们同时按下按钮并移动滑块会发生什么?您的按钮查找会失败吗?我认为字典/每个可能的组合是不正确的方法,但如果不了解更多关于数据格式的信息,很难推荐更好的方法。
  • @RonBeyer 也许是正确的方法是错误的方法,但不确定更好的解决方案。该设备是一个复合 USB 设备,设备的每个部分(按钮、滑块、编码器、LED 等)都有多个端点,每个都有自己的端点。字节数组第一个索引处的“3”表示它是哪个端点。按钮是 1,滑块是 3,等等。当它们同时按下和移动时,它只是从一个到另一个,因为它不能同时在数组的第一个索引中输出不同的值。

标签: c# range bytearray libusb libusbdotnet


【解决方案1】:

C# 是一种面向对象的语言,我将为设备创建一个具有所有属性的对象。由于我对该设备了解不多,所以我不得不猜测很多,但这是我想出的,它应该很容易扩展到您需要使用它的用途。

public class MyDevice
{
    private const int PayloadIdByte = 0;
    private const int PayloadSliderId = 3;
    private const int PayloadButtonId = 4;
    private const int Button1Byte = 1;
    private const int Button2Byte = 2;
    private const int Button3Byte = 3;
    private const int Slider1Byte = 4;
    private const int Slider2Byte = 3;
    private const int PayloadSize = 8;

    public bool Button1 { get; set; }
    public bool Button2 { get; set; }
    public bool Button3 { get; set; }
    public byte Slider1 { get; set; }
    public byte Slider2 { get; set; }

    public MyDevice()
    {

    }

    public void Update(byte[] payload)
    {
        if (payload.Length != PayloadSize)
            throw new ArgumentException("payload");

        if (payload[PayloadIdByte] == PayloadSliderId)
        {
            Slider1 = payload[Slider1Byte];
            Slider2 = payload[Slider2Byte];
        }

        if (payload[PayloadIdByte] == PayloadButtonId)
        {
            Button1 = payload[Button1Byte] > 0;
            Button2 = payload[Button2Byte] > 0;
            Button3 = payload[Button3Byte] > 0;
        }
    }
}

您可以在对象更新时添加事件、附加功能等。当您从 USB 读取新的有效负载时,只需将其传递给更新函数,让该函数将有效负载解析到对象中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 2023-04-01
    • 1970-01-01
    • 2011-04-08
    • 2020-03-25
    相关资源
    最近更新 更多