题
在.Net的SerialPort对象中,有没有办法确定串行端口是否被拔出或插入。
解决方案
与USB,串口没有任何内置的方式来检测链路状态的物理变化。有限形式的“设备就绪/未就绪”的信号可以使用做了一些引脚(即DTR,DSR,有时DCD),但是这似乎并不像你正在寻找(它不是建立在什么到RS232 - 设备必须支持它,你主要用它来跟调制解调器)
因此,简而言之:无,在一般情况下。如果你知道/可你想与之通信的器件进行编程,而你知道,这将保持一定的线高(例如),你可以查询它寻找该行去高。但是,如果你的设备是不是编程做一些预测的那样堵塞,那么就真的没有办法告诉。 (有些设备可能在默认情况下保持较高的DSR,但它绝不是一个肯定的赌注。)
其他提示
大多数串行设备具有某种类型的ACK响应于查询的。只需发送一个简单的查询,并等待回应。如果你不明白这一点,该设备是不存在的,或者至少没有响应。
我没试过,但看看 串口.PinChanged 事件和 Dsr更改.
每当有任何正常设备插入串行端口并打开时,我都希望该端口的 DSR 引脚被置位;相反,如果该设备被拔掉,或者当它被关闭时,那么我预计 DSR 引脚状态会改变/下降。
各个引脚的通常含义是:
- 数字SR:设备已插入并打开
- 中试:设备已准备好接收数据(即使设备已插入,也可能会出现故障,例如当设备具有有限的板载缓冲区并使用该引脚来控制来自 PC 的数据传输时)
- 直流电:设备(调制解调器)已通过电话线与另一个调制解调器建立连接(因此您发送的任何内容都将被视为要传输到远程调制解调器的数据)
其中,回答你的OP的是DSR。
那里 是 一种检测 .NET 中串行端口删除/插入的方法 - 请参阅我的答案 检测串口插拔
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
您可以检测可获取的串行端口,则可以尝试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
}
这将取决于你用什么样的电缆连接的设备种类。
您最好的选择是尝试处理PinChanged事件处理程序。
连接,并且在开启时,其它的CTS某些设备将提高DSR,其他人将使用这些用于握手。
不隶属于 StackOverflow