9

我最近一直在使用 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 也不可靠。即使这样,也不能保证在多台机器上可靠。

4

3 回答 3

11

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

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

Serial.DataReceived Serial.ErrorReceivedSerial.Write

通常我会在指定的时间间隔发出轮询命令以确保设备已连接。当设备响应时,它将触发DataReceived事件,您可以相应地处理响应(以及任何其他必要的数据)。这可以与简单的 Timer 或递增变量结合使用,以对响应进行计时。请注意,您需要适当地设置ReadTimeoutandWriteTimeout值。这与ReadExistingand/orReadLine方法一起可能在您的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)
于 2013-07-11T15:17:34.087 回答
4

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

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

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

于 2013-07-11T14:41:08.660 回答
1

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

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

您可以将此示例用作起点。

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

编辑:

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

于 2013-07-11T14:38:55.930 回答