使用LibUSB从USB设备读取一系列输出

时间:2015-04-24 20:36:46

标签: c# range bytearray libusb libusbdotnet

我正在开发一个与通过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个条目?

1 个答案:

答案 0 :(得分:0)

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读取新的有效负载时,只需将其传递给Update函数,然后让该函数将有效负载解析为对象。