我最近一直在使用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);
它有效,但我觉得它有点hacky和不可靠。如果需要,我可以保留它,但如果有适当的替代方法,我会喜欢它。
编辑:我实际上必须将刻度值设置为大约10,000,以确保它的可靠性。否则我偶尔会收到数据。即使将其设置为1000或5000也是不可靠的。即使这样,也不能保证在多台机器上可靠。
答案 0 :(得分:10)
我也需要使用串口,相信我他们很痛苦。 我检查设备是否连接的方法通常围绕发出轮询命令。 虽然你的方法可能有用,但我不能帮助但是当事件足够时不愿意使用while循环。
.NET串口类提供了一些有用的事件:
Serial.DataReceived
Serial.ErrorReceived
和Serial.Write
通常我会以指定的时间间隔发出轮询命令以确保设备已连接。
当设备响应时,它将触发DataReceived
事件,您可以相应地处理响应(以及任何其他必要数据)。这可以与简单的Timer或递增变量结合使用来为响应计时。请注意,您需要适当设置ReadTimeout
和WriteTimeout
值。这个以及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)
答案 1 :(得分:4)
不幸的是,对于串行端口,没有正确的方法来确定某个设备是否已连接。您可以编写一条只有您的设备才能正确响应的魔术消息,但如this answer中所述,此方法可能会导致其他连接设备出现问题。
最终,您只需要依赖用户选择正确的端口。
此外,如果您碰巧失去了与设备的连接,您只会知道何时无法读取/写入设备。在这种情况下,只需抛出一个LostConnection事件。
答案 2 :(得分:1)
我同意这是一个hacky,因为任何设备都可以连接并发送'>';但这并不代表你的设备。
相反,要动态并使用类似SerialPort.GetPortNames和WMI Queries的内容来查询插入COM端口的设备。
您可以使用this示例作为起点。
阅读完文档和示例后,您应该能够创建一个列出计算机及其连接的COM端口上的驱动程序的所有设备信息。
修改强>
由于设备未自行注册,请考虑查看Visual Studio的product drivers,这可能会使您的工作变得更加轻松。