Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HID温度设备报告读取_C#_Usb_Sensors_Hid - Fatal编程技术网

C# HID温度设备报告读取

C# HID温度设备报告读取,c#,usb,sensors,hid,C#,Usb,Sensors,Hid,我得到了一个项目,其中包括将温度和湿度USB传感器集成到我公司的应用程序中。我必须承认,我完全了解与HID设备的通信 因此,有一个来自中国制造商的USB传感器,它没有任何文档,只有一个MS Windows应用程序,可以读取当前的温度和湿度,还可以通过一个名为SLABHidDevice.dll的库读取存储在内存中的所有记录。我联系了该设备的供应商,也联系了Silicon Labs公司(SLABHidDevice.dll的创建者),以获取一些文档或帮助,但都没有成功 在尝试了许多USB嗅探器应用程序

我得到了一个项目,其中包括将温度和湿度USB传感器集成到我公司的应用程序中。我必须承认,我完全了解与HID设备的通信

因此,有一个来自中国制造商的USB传感器,它没有任何文档,只有一个MS Windows应用程序,可以读取当前的温度和湿度,还可以通过一个名为SLABHidDevice.dll的库读取存储在内存中的所有记录。我联系了该设备的供应商,也联系了Silicon Labs公司(SLABHidDevice.dll的创建者),以获取一些文档或帮助,但都没有成功

在尝试了许多USB嗅探器应用程序(如USBlyzerUSBTrace)之后,我发现HID设备需要哪种类型的字节才能发回报告,因此我使用许多HID库创建了一个C#demo应用程序。通过嗅探USB设备,我成功地模拟了触发设备输出正确回复的正确请求

我的问题如下:我使用VIDPID(VendorID,ProductID)与设备连接,我还能够获得设备的一些详细信息,如序列号设备路径MaxInputReportLength等。此外,我可以使用GetInputReport()函数请求报告,提供一个缓冲区,该缓冲区在第一个字节(例如0x05)中包含所需的报告ID,并且我还可以读取从上述函数返回的缓冲区。不幸的是,缓冲区不包含我可以读取的任何信息(例如/n.Ô.Ï.P..ôd.)。在阅读许多关于HIDs报告的文档时,我意识到任何HID设备固件中都有报告描述符,其中包含所有可以导入/导出的报告的结构

因此,我的主要问题是:我是否需要任何特定于设备的文档来将缓冲区转换为可读数据,或者我是否可以使用设备输出的报告描述符从缓冲区提取数据

以下是使用USBlyzer应用程序提取的我的设备的报告描述符:

Interface 0 HID Report Descriptor Vendor-Defined 1
Item Tag (Value) Raw Data 
Usage Page (Vendor-Defined 1) 06 00 FF  
Usage (Vendor-Defined 1) 09 01  
Collection (Application) A1 01  
    Report ID (1) 85 01  
    Report Count (4) 95 04  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01
    Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02

    Report ID (2) 85 02  
    Report Count (60) 95 3C  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01  
    Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02

    Report ID (3) 85 03  
    Report Count (1) 95 01  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01  
    Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02

    Report ID (4) 85 04  
    Report Count (2) 95 02  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01  
    Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02  

    Report ID (5) 85 05  
    Report Count (31) 95 1F  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01  
    Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02  

    Report ID (6) 85 06  
    Report Count (60) 95 3C  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01  
    Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02  

    Report ID (7) 85 07  
    Report Count (60) 95 3C  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01  
    Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02 

    Report ID (8) 85 08  
    Report Count (60) 95 3C  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01  
    Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02 

    Report ID (9) 85 09  
    Report Count (9) 95 09  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01  
    Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02  
End Collection C0
如果需要特定于设备的文档,那么我无能为力。但是,如果不需要任何文档,我希望任何有HID通信经验的人提供帮助或建议

编辑:卸下设备的盖子后,我发现主要的微控制器是,我认为它完成了所有的工作

我还附上了该设备的详细信息。(由于我的声誉分数很低,无法直接发布)

多谢各位

我是否需要任何类型的特定于设备的文档 将缓冲区转换为可读数据 我可以使用报表描述符从缓冲区提取数据吗 该设备的输出

是和否。是的,您可以使用报告描述符机械地解析设备将处理的响应和生成请求。但在本例中,不会,因为构成每个请求/响应(报告)的字段(用法)是供应商定义的,所以您需要供应商提供的文档来描述每个报告的含义。知道该芯片是Silab F321也没有真正的帮助,因为它只是8051微控制器的一个变种,具有内置USB功能-数据记录器供应商(不是8051芯片供应商)已在其固件中对每个报告的含义进行了编码

从上面的报告描述符来看,供应商似乎也采取了一些捷径。通常,您会为温度、压力、湿度定义一个唯一的“用法”代码,并定义包含其中一个或多个的报告。在这种情况下,他们似乎在使用报表ID来确定每个“用法”的含义,也就是说,用法代码固定为1(因此不传达任何含义),报表ID用于标识每个报表的内容。但是,这对您没有帮助,因为您仍然不知道供应商希望每个报告的含义

您可以尝试“反向工程”其含义,但我不建议将应用程序基于反向工程接口

下面是从上述报告描述符(通过名为的工具)机械生成的一组C结构定义,但它仍然无法帮助您理解每个报告的含义:

//--------------------------------------------------------------------------------
// Vendor-defined inputReport 05 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x05 (5)
  uint8_t  VEN_VendorDefined0001[31];                // Usage 0xFF000001: , Value = 0 to 255
} inputReport05_t;


//--------------------------------------------------------------------------------
// Vendor-defined inputReport 06 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x06 (6)
  uint8_t  VEN_VendorDefined0001[60];                // Usage 0xFF000001: , Value = 0 to 255
} inputReport06_t;


//--------------------------------------------------------------------------------
// Vendor-defined inputReport 07 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x07 (7)
  uint8_t  VEN_VendorDefined0001[60];                // Usage 0xFF000001: , Value = 0 to 255
} inputReport07_t;


//--------------------------------------------------------------------------------
// Vendor-defined inputReport 08 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x08 (8)
  uint8_t  VEN_VendorDefined0001[60];                // Usage 0xFF000001: , Value = 0 to 255
} inputReport08_t;


//--------------------------------------------------------------------------------
// Vendor-defined outputReport 01 (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x01 (1)
  uint8_t  VEN_VendorDefined0001[4];                 // Usage 0xFF000001: , Value = 0 to 255
} outputReport01_t;


//--------------------------------------------------------------------------------
// Vendor-defined outputReport 02 (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x02 (2)
  uint8_t  VEN_VendorDefined0001[60];                // Usage 0xFF000001: , Value = 0 to 255
} outputReport02_t;


//--------------------------------------------------------------------------------
// Vendor-defined outputReport 03 (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x03 (3)
  uint8_t  VEN_VendorDefined0001;                    // Usage 0xFF000001: , Value = 0 to 255
} outputReport03_t;


//--------------------------------------------------------------------------------
// Vendor-defined outputReport 04 (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x04 (4)
  uint8_t  VEN_VendorDefined0001[2];                 // Usage 0xFF000001: , Value = 0 to 255
} outputReport04_t;


//--------------------------------------------------------------------------------
// Vendor-defined outputReport 09 (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x09 (9)
  uint8_t  VEN_VendorDefined0001[9];                 // Usage 0xFF000001: , Value = 0 to 255
} outputReport09_t;
//--------------------------------------------------------------------------------
//供应商定义的inputReport 05(设备-->主机)
//--------------------------------------------------------------------------------
类型定义结构
{
uint8\u t reportId;//报告ID=0x05(5)
uint8\u t VendorDefined0001[31];//用法0xFF000001:,值=0到255
}输入报告05_t;
//--------------------------------------------------------------------------------
//供应商定义的inputReport 06(设备-->主机)
//--------------------------------------------------------------------------------
类型定义结构
{
uint8\u t reportId;//报告ID=0x06(6)
uint8\u t VendorDefined0001[60];//用法0xFF000001:,值=0到255
}输入报告06_t;
//--------------------------------------------------------------------------------
//供应商定义的inputReport 07(设备-->主机)
//--------------------------------------------------------------------------------
类型定义结构
{
uint8\u t reportId;//报告ID=0x07(7)
uint8\u t VendorDefined0001[60];//用法0xFF000001:,值=0到255
}输入报告07_t;
//--------------------------------------------------------------------------------
//供应商定义的inputReport 08(设备-->主机)
//---------------------------------
5 0 0 79 200 1 94 2 205 1 111 1 144 1 244 0 100 3 182 0 3 1 1 0 0 0 0 0 0 0 0 9
-> 1 94 -> hex 1 5e -> dec 350 -> /10 -> 35.0
2 205 -> hex 2 cd -> dec 717 - 400 (magic) -> 317 /10 -> 31.7