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 deviceIDs = new List();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#程序设置为管理员身份运行解决。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
