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

本文关键字:是否 连接 串行端口 检查 | 更新日期: 2023-09-27 18:22:08

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

            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);

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

编辑:实际上,我必须将刻度值设置为10000左右,以确保它的可靠性。否则,我有时无法接收数据。即使将其设置为1000或5000也是不可靠的。即便如此,它也不能保证在多台机器上都是可靠的。

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

我也需要使用串行端口,相信我,它们很痛苦。我检查设备是否连接的方法通常围绕着发出轮询命令。虽然你的方法可能有效,但当一个事件足够时,我忍不住不愿意使用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 (e.g TimeOutException, InvalidOperationException)

不幸的是,对于串行端口,没有正确的方法来确定是否连接了某个设备。你可以写一条只有你的设备才能正确响应的神奇消息,但正如这个答案中所描述的,这种方法可能会给其他连接的设备带来问题。

最终,你只需要依靠用户选择正确的端口

此外,如果你碰巧失去了与设备的连接,你只有在读写失败时才能知道。在这种情况下,只需抛出LostConnection事件。

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

相反,应该是动态的,并使用SerialPort.GetPortNames和WMI查询之类的东西来询问插入COM端口的设备。

您可以将此示例作为一个起点。

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

编辑:

由于设备本身没有注册,请考虑查看Visual Studio的产品驱动程序,这可能会让您的工作更轻松。