C#串口检查设备是否已连接

我最近一直在使用SerialPort类。 目前我正在试图找出检查设备是否连接到我的应用程序使用的comm端口的正确方法。 有没有正确的方法来检查设备是否连接到通信端口? 我目前的方法如下:

while (isReading == true) { try { received += serialPort.ReadExisting(); if (received.Contains('>')) isReading = false; } catch (Exception e) { } if (tick == 10000) if (received == "") { Console.WriteLine("No Data Received. Device isn't connected."); isReading = false; } tick++; } Console.WriteLine(received); 

它有效,但我觉得它有点hacky和不可靠。 如果需要,我可以保留它,但如果有适当的替代方法,我会喜欢它。

编辑:我实际上必须将刻度值设置为大约10,000,以确保它是可靠的。 否则我有时无法收到数据。 即使将其设置为1000或5000也是不可靠的。 即使这样,也不能保证在多台机器上可靠。

我也需要使用串口,​​相信我他们很痛苦。 我检查设备是否已连接的方法通常围绕发出轮询命令。 虽然你的方法可能有用,但我不能帮助但是当事件足够时不愿意使用while循环。

.NET串口类提供了一些有用的事件:

Serial.DataReceived Serial.ErrorReceivedSerial.Write

通常我会以指定的间隔发出轮询命令以确保设备已连接。 当设备响应时,它将触发DataReceived事件,您可以相应地处理响应(以及任何其他必要数据)。 这可以与简单的Timer或递增的变量结合使用来为响应计时。 请注意,您需要适当地设置ReadTimeoutWriteTimeout值。 这与ReadExisting和/或ReadLine方法一起可能在您的DataReceived事件处理程序中使用。

总而言之,(在伪代码中)

 Send Polling command, Start Timer Timer to CountDown for a specified time If Timer fires, then assume no response If DataRecieved fires (and expected response) assume connection (of course handle any specific Exceptions (eg TimeOutException, InvalidOperationException) 

不幸的是,对于串行端口,没有正确的方法来确定某个设备是否已连接。 您可以编写一条只有您的设备才能正确响应的魔术消息,但如本答案中所述 ,此方法可能会导致其他连接设备出现问题。

最终,您只需要依赖用户选择正确的端口。

此外,如果您碰巧失去了与设备的连接,您只会知道何时无法读取/写入设备。 在这种情况下,只需抛出LostConnection事件。

我同意这是一个hacky,因为任何设备都可以连接并发送’>’; 但这并不意味着它是你的设备。

相反,要动态并使用类似SerialPort.GetPortNames和WMI查询的内容来查询插入COM端口的设备。

您可以使用此示例作为起点。

阅读文档和示例后,您应该能够创建一个列出计算机及其连接的COM端口上的驱动程序的所有设备信息。

编辑:

由于设备不会自行注册,因此请考虑查看Visual Studio的产品驱动程序 ,这可能会使您的工作变得更加容易。