c#程序与USB HID设备进行通信

本文详细描述了一个C#编写的WindowsForms应用程序,用于与USBHID设备进行数据交换,包括初始化设备列表、处理设备插入/拔出事件、设备识别、数据收发操作以及事件响应。
摘要由CSDN通过智能技术生成

这段代码是一个C#编写的Windows Forms应用程序的一部分,它用于与USB HID设备进行通信。代码中包含了初始化USB设备列表、处理USB设备插入和拔出事件、获取设备、以及执行USB IN和OUT操作的方法。下面是对这段代码的整理和解释:

using System;
using System.Drawing;
using System.Windows.Forms;
using CyUSB; // CyUSB是一个用于USB通信的库

namespace Debug_Tool
{
    public partial class MainTool : Form
    {
        private USBDeviceList usbDevices; // USB设备列表
        private CyHidDevice myHidDevice; // USB HID设备实例
        private const int VID = 0x0483; // 设备供应商ID
        private const int PID = 0x5750; // 设备产品ID
        private int deviceIndex; // 用于存储设备索引

        public MainTool()
        {
            InitializeComponent();
            InitializeUSB();
        }

        private void InitializeUSB()
        {
            usbDevices = new USBDeviceList(CyConst.DEVICES_HID);
            usbDevices.DeviceAttached += UsbDevices_DeviceAttached;
            usbDevices.DeviceRemoved += UsbDevices_DeviceRemoved;
            deviceIndex = -1; // 初始化设备索引为无效值
            GetConnectedDevices();
        }

        private void GetConnectedDevices()
        {
            // 遍历所有已连接的USB设备
            foreach (var device in usbDevices)
            {
                if (device.VendorID == VID && device.ProductID == PID)
                {
                    deviceIndex = usbDevices.IndexOf(device); // 更新设备索引
                    myHidDevice = device as CyHidDevice; // 实例化USB HID设备
                    break; // 找到设备后退出循环
                }
            }
        }

        private void UsbDevices_DeviceAttached(object sender, EventArgs e)
        {
            USBEventArgs usbEvent = e as USBEventArgs;
            if (usbEvent.VendorID == VID && usbEvent.ProductID == PID)
            {
                // 执行USB设备插入操作
                // ...
            }
        }

        private void UsbDevices_DeviceRemoved(object sender, EventArgs e)
        {
            USBEventArgs usbEvent = e as USBEventArgs;
            if (usbEvent.VendorID == VID && usbEvent.ProductID == PID)
            {
                // 执行USB设备拔出操作
                // ...
                deviceIndex = -1; // 更新设备索引为无效值
                myHidDevice = null; // 重置USB HID设备实例
            }
        }

        public int ReceiveUSBData(byte[] data)
        {
            int num = 0;
            if (myHidDevice != null)
            {
                if (myHidDevice.ReadInput())
                {
                    num = myHidDevice.Inputs.RptByteLen;
                    if (num > 0)
                    {
                        // 复制数据到提供的数组,跳过第一个字节(可能是报告ID)
                        for (int temp = 0; temp < num - 1; temp++)
                        {
                            data[temp] = myHidDevice.Inputs.DataBuf[temp + 1];
                        }
                    }
                }
                else
                {
                    // 如果读取失败,尝试重读
                    if (myHidDevice.ReadInput())
                    {
                        num = myHidDevice.Inputs.RptByteLen;
                        if (num > 0)
                        {
                            for (int temp = 0; temp < num - 1; temp++)
                            {
                                data[temp] = myHidDevice.Inputs.DataBuf[temp + 1];
                            }
                        }
                    }
                }
            }
            return num;
        }

        public bool SendUSBData(byte[] data, int length)
        {
            bool status = false;
            if (myHidDevice != null)
            {
                // 设置输出报告的ID
                myHidDevice.Outputs.DataBuf[0] = myHidDevice.Outputs.ID;
                // 复制数据到输出报告缓冲区
                for (int temp = 0; temp < length; temp++)
                {
                    myHidDevice.Outputs.DataBuf[temp + 1] = data[temp]; // 跳过第一个字节
                }
                status = myHidDevice.WriteOutput();
            }
            return status;
        }
    }
}

这段代码是一个C#编写的Windows Forms应用程序的一部分,其主要功能是与特定的USB HID(Human Interface Device,人类接口设备)进行通信。具体来说,它能够识别、连接到特定的USB HID设备,并与之进行数据的发送(OUT)和接收(IN)。以下是代码的主要功能描述:

  1. 初始化USB设备列表

    • 使用USBDeviceList类创建一个USB设备列表,该列表用于存储所有已连接的USB HID设备的信息。
    • 注册设备插入和拔出事件的处理方法,以便在设备状态变化时执行相应的操作。
  2. 设备识别与连接

    • 在初始化过程中,代码会遍历所有已连接的USB设备,寻找与预定义的供应商ID(VID)和产品ID(PID)匹配的设备。
    • 一旦找到匹配的设备,它会记录设备的索引,并尝试将其实例化为CyHidDevice对象,以便进行后续的数据传输操作。
  3. 数据接收(IN操作)

    • 提供了一个名为ReceiveUSBData的公共方法,用于从USB HID设备接收数据。
    • 该方法首先检查是否已成功连接到设备,然后尝试读取输入数据。
    • 如果读取成功,它会将数据从设备的输入缓冲区复制到提供的字节数组中,并返回读取的数据长度。
    • 如果第一次读取失败,它会尝试再次读取,这可能是为了处理某些情况下(如电脑从睡眠状态唤醒后)USB输入延迟的问题。
  4. 数据发送(OUT操作)

    • 提供了一个名为SendUSBData的公共方法,用于向USB HID设备发送数据。
    • 该方法首先检查是否已成功连接到设备,然后设置输出报告的ID,并将要发送的数据复制到设备的输出缓冲区。
    • 之后,它调用WriteOutput方法将数据发送到设备,并返回发送操作的成功状态。
  5. 事件处理

    • 当USB设备被插入时,UsbDevices_DeviceAttached事件处理方法会被调用,这里可以执行设备插入后的操作,如更新UI或准备接收数据。
    • 当USB设备被拔出时,UsbDevices_DeviceRemoved事件处理方法会被调用,这里可以执行设备拔出后的操作,如清理资源或通知用户。

这段代码的目的是作为一个调试工具,用于开发和测试USB HID设备。它允许开发者通过这个工具与USB设备进行交互,发送测试数据并接收设备的响应。这对于硬件开发和调试阶段非常有用。

OpenAI还有什么有趣的功能
openai和alphago什么关系
openAI的neuralink
如何使用openai生成图像 请给出示例代码
openai的plaNet 如何使用,请给出示例代码,并解读
openai的Habitat 如何使用,请给出示例
OpenAI Gym详细讲解一下,给出示例代码
python 如何删除文件?
python 如何播放声音
python 把字符串当数组来操作就对了
python3.7.9 安装包下载
python 如何统计文本里文字字数?
python 如何给文件改名
如何执行python setup.py
python 如何写入文本文件?
Python 如何获取文件路径?
如何在 Python 中逐行读取文件名到列表中?
Pandas如何处理excel列中数据?
如何在 Python 中逐行读取一个文件到列表?
python 给初学者的建议

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
赋所有源代码,开发工具vs2010 framework3.5 baidu搜索c# HidUsb都是大同小异案例,而且拿下来基本不能用。大都是围绕public static extern int CreateFile(省略众多参数..);发现没有,copy下来测试基本都是用不了的。 原因很简单:windows不允许你用程序随便就去访问硬件设备。所以在此把之前做过的基于C#开发读写HidUsb设备的项目整理成一个简单的小案例,分享给大家,开发环境VS2010。 该案例重点在public static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, IntPtr lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile); 看着貌似也是用到CreateFile这个函数,其实并不然,注意到没有"SafeFileHandle",这就是重点! 这样windows是允许程序访问外接hidusb设备的。 当然具体如何运用这个函数现在已经不是您应该 关心的了,因为我已经为您把它封装成一个类,您只要调用相应的方法就OK. 例: //第一步:获取HidUsb设备信息 List slist = new List(); UsbHidDevice usbhid = new UsbHidDevice(); usbhid.GetDeviceList(ref slist); //HidUsb设备信息包含在List数据集中 注:当获取到HidUsb设备信息为:\\?\hid#vid_0e2c&pid;_0112#6&1b44c403;&0&0000;#{4d1e55b2-f16f-11cf-88cb-001111000030}, 注意该字符串里的“vid_0e2c”和“pid_0112”部分,那么: vid为0e2c, pid为:0112 //第二步:创建一个HidUsb设备访问实例 UsbHidDevice Device = new UsbHidDevice(vid, pid); //第三步:连接HidUsb设备 Boolean connBool = Device.Connect(); //第四步:实现数据接收事件 Device.DataReceived += new UsbHidDevice.DataReceivedDelegate(Device_DataReceived); //当HidUsb设备返回信息时触发此事件 void Device_DataReceived(byte[] data) { //处理接收到的数据逻辑 } //第五步:向Hid设备发送数据"0xa0 00 0x12 0x9 0x22" string txt = "0xa0 00 0x12 0x9 0x22"; //把数据转换为字节数组 byte[] data = ConvertHelper.StringToByte(txt2); byte bt = 0; CommandMessage cmdMsg = new CommandMessage(bt, data); Boolean sbool = Device.SendMessage(cmdMsg); //发送数据 //第六步:释放所有资源 Device.Dispose();
USB HID设备是一种使用USB接口进行通信设备,它可以通过发送和接收数据来实现和计算机的交互。为了读写USB HID设备数据,我们需要编写一个程序来实现这个功能。 首先,我们需要使用合适的编程语言和相关的库来开发这样一个程序。对于Windows系统,我们可以使用C#、C++或者Python等语言来编写程序;对于Linux系统,则可以选择C语言、Python等来实现。然后,我们需要选择一个合适的USB库,比如libusb,它提供了一些用于控制USB设备的函数和结构体。 接着,我们需要编写程序进行USB设备的初始化和连接。一般来说,我们需要找到目标设备的vendor ID和product ID,然后使用相关函数来打开设备进行数据的读写。 在程序运行的过程中,我们可以使用相关函数来读取设备发送的数据,也可以发送命令或者数据给设备。在读取数据时,我们需要根据设备的协议和数据格式进行解析和处理,以确保能正确地获取到设备发送的信息。 最后,我们需要进行错误处理和资源释放。当程序出现错误时,我们需要进行相应的处理,比如关闭设备,释放相关资源等,以确保程序的稳定性和可靠性。 总的来说,编写USB HID设备数据读写程序是一个需要考虑设备协议、数据格式等因素的复杂任务,但通过合适的编程语言和库的选择,以及认真的编程实现,我们可以成功地实现这一功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

openwin_top

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值