在.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,其他人将使用这些用于握手。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top