【发布时间】:2013-05-23 14:28:24
【问题描述】:
我正在为平板电脑制作一种基于 Arduino 的扩展坞原型,使用 USB 端口作为连接器。这意味着我需要支持在平板电脑上的应用程序运行时插入/拔出 USB 连接器的能力。
平板电脑运行一个 c# 应用程序(Win7 64 位上的 .net 4.5),我在其中连接到 Arduino Uno。当应用程序启动时,我使用以下命令循环所有可用的 COM 端口:
var ports = SerialPort.GetPortNames(); // -> [COM3,COM4,COM8]
foreach (var port in ports)
{
var serial = new SerialPort(portname, baudRate);
//attempt handshake and connect to right port
}
这工作正常,但如果我拔下并重新插入 USB 电缆并重新尝试重新连接到 Arduino(当应用程序仍在运行时),Arduino 端口 (COM8) 不再列在:
SerialPort.GetPortNames(); // -> [COM3,COM4] and no COM8
即使重新启动应用程序(重新插入 Arduino)也只会列出 [COM3,COM4]。
让它恢复工作的唯一方法是在应用程序未运行时拔下并重新插入 Arduino。
让我感到困惑的是,当我在启动应用程序后插入 Arduino Uno 时,SerialClass 确实识别出新添加的端口并允许我连接。
仅当我在应用程序运行时拔下并重新插入设备时才会出现此问题。似乎尽管能够重置 COM 端口(在代码中或在设备管理器中手动),但 SerialClass(和本机 Win32_SerialPort - 我也检查过)无法识别这一点,除非我重新启动应用程序
这可能是什么原因?以及如何确保我的应用程序可以重新连接到该端口?除了使用 SerialPort 来处理 USB 连接器之外,还有其他方法吗?
【问题讨论】:
-
稍等一下,你是用串口当USB口,还是用USB口当串口? AFAIK,每次您将某些东西重新连接到 COM 端口时,您都需要重新启动它。
-
串行端口,我一直将东西连接到串行端口而无需重新启动。真正的串口(rs-232)非常健壮。(我想)
-
您是否尝试过处理掉那个 SerialPort* 实例并在失去连接时创建一个新实例?
-
同样的问题。每个 USB 驱动程序都以自己的方式行为不端。您的具体问题是它没有正确更新注册表,即 SerialPort 在调用 GetPortNames() 时使用的键。信息应该很清楚,不要在端口使用时断开电缆,这是没有意义的。当 Windows 正在写入闪存驱动器时,您也不会将闪存驱动器从 USB 端口中拔出,以同样的方式对待 USB 仿真器。如果出于某种神秘原因,此功能对您来说必不可少,那么您需要购买另一个具有更好驱动程序的功能。
-
我在链接的问题中给出了非常具体的建议。编写自己的驱动程序当然不是其中的一部分。
标签: c# .net serial-port arduino