【问题标题】:C# Serial Port Check if Device is ConnectedC#串口检查设备是否已连接
【发布时间】:2013-07-09 21:06:07
【问题描述】:

我最近一直在使用 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);

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

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

【问题讨论】:

  • 你也在给设备编程吗?
  • @Rubixus 没有。这是一种称为 Fluke 5500A 多产品校准器的医疗设备。我什至没有自己更改它的内部设置。
  • 设备在插入时是否在注册表中注册了驱动程序?是 USB 设备吗?
  • @NETscape 不。 5500没有。它通过 RS-232 连接进行连接。我所做的只是通过 SerialPort 类或终端发送命令。
  • 那么一定要考虑使用StopwatchTimer...然后你可以在停止收听之前确保n 的毫秒数过去了。

标签: c# serial-port


【解决方案1】:

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

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

Serial.DataReceivedSerial.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)

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 如果设备有驱动程序,您可以使用 WMI 查询来识别设备,如我的回答中所述。这个答案具有误导性。如果没有驱动,可以学习写驱动,自己写,检测设备。
    • @NETscape 我不相信答案具有误导性。他提出了一个很好的观点。串行连接非常不确定。他们可能很难使用。驱动程序并不是真正的选择。
    • @Rubixus 我现在已经将它部署在 RS232 设备的应用程序中。他们可以工作。
    【解决方案3】:

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

    相反,请保持动态并使用SerialPort.GetPortNamesWMI Queries 之类的东西来询问插入COM 端口的设备。

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

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

    编辑:

    由于设备不会自行注册,因此请考虑查看 Visual Studio 的 product drivers,这可能会让您的工作轻松很多。

    【讨论】:

    • '>' 只是标记字符,表示设备已完成发出命令并且所有内容都已写入缓冲区。我目前检查设备是否已连接的方法是等待一段时间,然后检查收到的内容是否不仅仅是空字符串。问题是在一台好的计算机上,在接收到任何数据之前,tick 值可以增加 10,000 倍。这不是我可以轻易依赖的东西。
    • 此方法仅适用于 USB 串行设备,不适用于 OP 指定的 RS232。
    • @Rubixus 这就是我给出的例子。您可以对已安装驱动程序的设备使用 WMI 查询。安装驱动程序后,它将显示在您的设备管理器中。如果它在您的设备管理器中,您可以使用 WMI 查询找到它。所以你的评论也是无效的。
    • 是的。根据应用程序使用@ZachSmith,您还可以购买 USB-RS232 转换器并使用我的答案:]
    • 此外,您可以使用我的答案中的一些方法来消除流程,以指导用户选择正确的设备。
    猜你喜欢
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    相关资源
    最近更新 更多