在.Net的SerialPort对象中,有没有办法确定串口是否已拔下或插入。
答案 0 :(得分:14)
与USB不同,串行端口没有任何内置方法来检测链路状态的物理变化。可以使用一些引脚(即DTR,DSR,有时是DCD)来完成有限形式的“设备就绪/未就绪”信号,但这看起来不像您正在寻找的(它不是内置的)到RS232 - 设备必须支持它,你主要用它来与调制解调器通信。)
因此,简而言之:不,一般情况下。如果您知道/可以对您尝试与之通信的设备进行编程,并且您知道它将保持一定的高线(例如),您可以轮询它以查找该线路变高。但是如果你插入一个没有编程的设备来做那样可预测的事情,那么真的没办法说出来。 (有些设备可能会默认将DSR设置为高电平,但绝对不能确定。)
答案 1 :(得分:2)
大多数串行设备对查询都有某种类型的ack响应。只需发送一个简单的查询并等待响应。如果你没有得到它,设备就不存在或者至少没有响应。
答案 2 :(得分:1)
我没有尝试过,但请查看SerialPort.PinChanged事件和DsrChanged。
每当有任何普通设备插入串口并打开时,我都希望端口的DSR引脚被置位;相反,如果该设备被拔掉,或者当它被关闭时,那么我希望DSR引脚状态能够改变/下降。
各种引脚的通常含义是:
其中,回答OP的是DSR。
答案 3 :(得分:1)
是一种检测.NET中串行端口删除/插入的方法 - 请参阅我在Detect serial port insertion/removal的回答
答案 4 :(得分:1)
Public Class SerialPort
Inherits IO.Ports.SerialPort
Event Disconnected()
Public Sub OpenWithDisconnectionevent()
Me.Open()
Dim t As New Threading.Thread(AddressOf ConnectivityChecker)
t.Start()
End Sub
Sub ConnectivityChecker()
Do
If Me.IsOpen = False Then
RaiseEvent Disconnected()
GoTo ThreadExit
End If
Loop
ThreadExit:
End Sub
End Class
答案 5 :(得分:0)
你可以检测到可用的串口,你可以尝试在try ... catch块中与它们通信。
这是c#
中端口检测的示例using System;
using System.Collections.Generic;
using System.IO.Ports;
public class MyClass
{
public static void Main()
{
string[] sPorts = SerialPort.GetPortNames();
foreach(string port in sPorts)
WL(port);
RL();
}
#region Helper methods
private static void WL(object text, params object[] args)
{
Console.WriteLine(text.ToString(), args);
}
private static void RL()
{
Console.ReadLine();
}
private static void Break()
{
System.Diagnostics.Debugger.Break();
}
#endregion
}
答案 6 :(得分:0)
这将取决于您使用何种类型的电缆连接的设备类型。
您最好的办法是尝试处理PinChanged事件处理程序。
某些设备在连接和打开时会引发DSR,其他设备会使用这些设备进行握手。