在我近期的一个项目中,我使用了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#程序设置为管理员身份运行解决。