赵泽荣. 2023-03-23 10:49 采纳率: 0%
浏览 131
已结题

C#上位机调试Win USB

#c# #winform #上位机 #UsbDevice #LibUsbDotNet

您好,各位朋友们,目前我在编写调试Win USB Device的上位机是遇到了几个问题,想问一下。

img

这是我想做成的界面。

我在网上查找资料调用的LibUsbDotNet库并添加在项目的一个类Readpolling.cs中,代码如下

using LibUsbDotNet;
using LibUsbDotNet.Main;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace boxed
{
    internal class Readpolling
    {
        public static UsbDevice MyUsbDevice; //公共静态定义的类名和对象

        #region SET YOUR USB Vendor and Product ID!   设置您的usb供应商和产品ID   // #region是分块预处理命令,它主要用于编译代码的分段,在编译时会被自动删除,必须以 #endregion终止

        public static UsbDeviceFinder MyUsbFinder = new UsbDeviceFinder(1234, 1); //公共静态定义类名和对象并且赋值

        #endregion

        //c#程序入口地址(同c的main()),访问修饰符(访问权限) + 关键字(静态) + 返回类型(不需要返回值) + 方法名(主程序) + string类(从控制台收参数) + 字符串()
        static void Main(string[] args)
        {
            //保存异常数据
            ErrorCode ec = ErrorCode.None;
            
            try
            {
                //找到并打开USB设备
                MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);

                //如果设备已经打开准备好
                if (MyUsbDevice == null)
                {
                    //若引发新的异常对象,显示设备没有被发现
                    throw new Exception("Device Not Found");
                }

                // If this is a "whole" usb device (libusb-win32, linux libusb-1.0)
                // it exposes an IUsbDevice interface. If not (WinUSB) the 
                // 'wholeUsbDevice' variable will be null indicating this is 
                // an interface of a device; it does not require or support 
                // configuration and interface selection.
                IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
                if (!ReferenceEquals(wholeUsbDevice, null)) //比较两个引用类型的对象是否是对于同一个对象的引用
                {
                    //这是一个“whole”USB device,使用前选择configuration interface
                    //选择配置
                    wholeUsbDevice.SetConfiguration(1);

                    //接口
                    wholeUsbDevice.ClaimInterface(0);
                }

                //打开并读取endpoint1
                UsbEndpointReader reader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01);

                byte[] readBuffer = new byte[1024]; //在内存中开辟块缓冲区,首地址readBuffer
                while (ec == ErrorCode.None) //一直在读取
                {
                    int bytesRead;

                    //如果5秒内没有发生数据,发生timeout error(ec = IoTimeOut)
                    ec = reader.Read(readBuffer, 5000, out bytesRead);

                    if (bytesRead == 0)

                        //引发新异常,将指定的 String类型的数据中的每个格式项替换为相应对象的值的文本等效项
                        throw new Exception(string.Format("{0}:No more bytes!", ec));
                    Console.WriteLine("{0} bytes read", bytesRead);

                    //将结果输出到控制台上,把当前编码字符串按指定编码方式编码为其他编码
                    Console.WriteLine(Encoding.Default.GetString(readBuffer, 0, bytesRead));


                    Console.WriteLine("\r\nDone!\r\n");

                }
            }

            catch (Exception ex)
            {
                Console.WriteLine();
                Console.WriteLine((ec != ErrorCode.None ? ec + ":" : String.Empty) + ex.Message); //空字符串
            }

            //读取数据后执行
            finally
            {
                if (MyUsbDevice != null)
                {
                    if (!MyUsbDevice.IsOpen)
                    {
                        // If this is a "whole" usb device (libusb-win32, linux libusb-1.0)
                        // it exposes an IUsbDevice interface. If not (WinUSB) the 
                        // 'wholeUsbDevice' variable will be null indicating this is 
                        // an interface of a device; it does not require or support 
                        // configuration and interface selection.
                        IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
                        if (!ReferenceEquals(wholeUsbDevice, null))
                        {
                            //释放interface 0
                            wholeUsbDevice.ReleaseInterface(0);
                        }
                        MyUsbDevice.Close();
                    }
                    MyUsbDevice = null;
                    //释放usb资源
                    UsbDevice.Exit();
                }

                Console.ReadKey();

            }
        }
    }
}

1.我不确定网上这个类的资料是否可以扫描到我的WinUSB Device设备。
2.在我的主体设计中,我不清楚如何通过serialport工具来调用ReadPolling类以及扫描出WinUSB Device设备。

@Java小白白又白 @根号五 @IT小生lkc @不良高须
希望获得朋友们的解答,感谢!

  • 写回答

8条回答 默认 最新

  • wanghui0380 2023-03-23 15:49
    关注

    其他代码都无需看,只看一句话即可

    #region SET YOUR USB Vendor and Product ID! 设置您的usb供应商和产品ID

    这句话很明确的告诉你,你需要的答案了

    Vendor and Product ID-----------------这句话说他是通过window设备描述符来查找设备的
    先看一个我随便搜出来的博文

    好了,这里可以回答你的第一个问题,只要你的设备管理器能找到他,你的代码就能找到他

    然后回答你的第2个问题
    还是先看一下这个库的官方实现

    这个东西说明,他完全没有依赖串口的意思,他采用调用C++编写的一个通用usb驱动---libusb驱动来实现通讯

    所以如果你想使用他,就不用考虑啥SerialPort了,因为他直接绕过串口类,直接访问驱动的,
    嗯其实也不是完全不能用,你可以用它的diviceinfo过滤类名是Port,name得到串口号,然后你自己在用SerialPort连接它

    评论

报告相同问题?

问题事件

  • 系统已结题 3月31日
  • 创建了问题 3月23日

悬赏问题

  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上
  • ¥15 提问一个关于vscode相关的环境配置问题,就是输入中文但是显示不出来,代码在idea可以显示中文,但在vscode不行,不知道怎么配置环境
  • ¥15 netcore使用PuppeteerSharp截图
  • ¥20 这张图页头,页脚具体代码该怎么写?
  • ¥15 关于#sql#的问题,请各位专家解答!
  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂