C#实现windows设备管理器的“卸载设备”和“扫描检测硬件改动”,解决Realsense无法连接的问题。

        在我近期的一个项目中,我使用了C#调用Realsense去实现了一些三维的测量功能。但Realsense的连接稳定性好像有一些问题。我遇到了以下几种:

1.        设备会断连,软件中重新初始化一次设备对象就可以继续使用;

2.         设备断联后重新初始化能够初始化成功,但无法采集到图像,此种情况我通过自动重启软件解决掉了

3.         最麻烦的问题,有时候设备断联后无法再次连接了,不管是使用我自己的软件或者是RealsenseViewer,都无法再次连接到这台realsense,而且哪怕是重启电脑都不管用,只能通过重新插拔并且换到一个其他的U口才能够解决问题。

        为了解决这种情况,我通过在设备管理器中的“通用串行总线设备”栏中,右击realsense设备,并选择“卸载设备”,之后右击选择“扫描检测硬件改动”。这样,设备就可以使用了。

        但这样的操作有些麻烦,假如产品交付给客户使用后,客户不会进行这样的操作就很尴尬了。所以我需要在C#程序中实现这些操作。

        为了实现对设备管理器的使用,我们首先需要获取devcon.exe。这个工具可以理解成设备管理器的命令行版本。其包含在WDK中,这里附上官网的链接Windows Device Console (Devcon.exe) - Windows drivers | Microsoft Docs

        从官网的链接转到下载地址Download the Windows Driver Kit (WDK) - Windows drivers | Microsoft Docs

        按照官网的说明,安装WDK首先需要安装vs2019,并且要在“工负载”中选择上C++桌面程序开发,幸亏我这里已经安装了。如果没有安装的同志需要先安装vs2019了。

        之后安装Windows SDK。

        最后,就可以安装WDK了。

        安装好后,可以在“C:\Program Files (x86)\Windows Kits\10\Tools\x64”路径下,找到devcon.exe了。关于如何在命令行里使用devcon,网上有很多相关的说明。大家可以先在命令行里试一试。

        通过使用rescan参数,可以实现“扫面检测硬件改动”的功能。

            Process process = new Process();
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.FileName = "C:\\Program Files (x86)\\Windows Kits\\10\\Tools\\x64\\devcon.exe";
            startInfo.Arguments = "-rescan";
            startInfo.UseShellExecute = false;
            startInfo.RedirectStandardInput = false;
            startInfo.RedirectStandardOutput = true;
            startInfo.CreateNoWindow = false;
            process.StartInfo = startInfo;
            startInfo.Verb = "RunAs";
            process.Start();

        删除设备稍微复杂一些,首先需要按照设备的类型获取到设备的ID。我这里的设备使用的是SR305 。想要删除设备,一定要指定设备的ID才行。这个ID也可以在设备管理器中,右键设备,选择“属性”,之后在详细信息这栏里浏览到设备实例路径时所显示出来的这个值。

         使用代码的话,如下。

            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity");
            List<string> deviceIDs = new List<string>();
            foreach (ManagementObject mgt in searcher.Get())
            {
                if (Convert.ToString(mgt["Name"]) == "Intel(R) RealSense(TM) Depth Camera SR305")
                {
                    Console.WriteLine(Convert.ToString(mgt["DeviceID"]));
                    deviceIDs.Add(Convert.ToString(mgt["DeviceID"]));
                }
            }

        但这里有些疑问,我通过C#代码得到的ID有两个,但我确实只插了一个realSense。这里我还没有仔细研究这串序列号的具体意义,如果有了解的大神请指点一下。

        获取到ID后,就可以通过ID来实现卸载设备了。 

            foreach (var item in deviceIDs)
            {
                string strOut = "";
                Process process = new Process();
                ProcessStartInfo startInfo = new ProcessStartInfo();
                startInfo.FileName = "C:\\Program Files (x86)\\Windows Kits\\10\\Tools\\x64\\devcon.exe";
                startInfo.Arguments = "-remove @" + item;
                startInfo.UseShellExecute = false;
                startInfo.RedirectStandardInput = false;
                startInfo.RedirectStandardOutput = true;
                startInfo.CreateNoWindow = false;
                process.StartInfo = startInfo;
                startInfo.Verb = "RunAs";
                process.Start();
            }

        到这里,就完成了设备的刷新了。如果需要下载我的代码,请点击ConsoleApp16.zip-制造文档类资源-CSDN下载

        在使用中,我遇到了这样一个问题,有一些设备如果直接在当前路径中执行devcon,会因为没有管理员权限而刷新失败。这样的情况可以通过将我们的C#程序设置为管理员身份运行解决。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值