문제

.NET의 시리얼 포트 객체에는 직렬 포트가 플러그를 뽑거나 플러그를 연결하는지 확인하는 방법이 있습니까?

도움이 되었습니까?

해결책

USB와 달리 직렬 포트에는 링크 상태의 물리적 변경을 감지 할 수있는 내장 방법이 없습니다. 일부 핀 (즉, DTR, DSR 및 때로는 DCD)을 사용하여 제한된 형태의 "장치 준비/준비되지 않은"신호를 수행 할 수 있지만, 이것은 정확히 당신이 찾고있는 것과 같지 않은 것 같습니다 (내장되지 않은 것은 아닙니다. RS232로 - 장치는이를 지원해야합니다. 주로 모뎀과 대화하는 데 사용합니다.)

간단히 말해서 : 일반적으로. 통신하려는 장치를 알고/프로그래밍 할 수 있고 특정 라인이 높게 유지 될 것이라는 것을 알고 있다면 (예를 들어) 해당 라인을 찾기 위해 설문 조사 할 수 있습니다. 그러나 예측할 수있는 작업을 수행하도록 프로그래밍되지 않은 장치를 연결하면 실제로 알 수있는 방법이 없습니다. (일부 장치는 기본적으로 DSR을 높게 유지할 수 있지만 확실하지 않습니다.)

다른 팁

대부분의 직렬 장치에는 쿼리에 대한 ACK 응답 유형이 있습니다. 간단한 쿼리를 보내고 응답을 기다리십시오. 당신이 그것을 얻지 못하면, 장치는 없거나 적어도 응답하지 않습니다.

나는 그것을 시도하지 않았지만 Serialport.pinchanged 이벤트 및 dsrchanged.

일련 포트에 플러그를 꽂고 켜지는 경우, 포트의 DSR 핀이 주장 될 것으로 예상됩니다. 반대로 해당 장치가 플러그를 뽑거나 꺼지면 DSR 핀 상태가 변경/드롭이 될 것으로 예상됩니다.


다양한 핀의 일반적인 의미는 다음과 같습니다.

  • DSR : 장치가 연결되어 전환됩니다
  • CTS : 장치가 데이터를 수신 할 준비가되었습니다 (장치가 꽂혀있는 경우에도 다운 될 수 있습니다. 예를 들어 장치에 온보드 버퍼가 제한된 경우이 PIN을 사용하여 PC에서 유량 제어 데이터 전송을 사용하는 경우).
  • DCD : Device (Modem)는 전화선을 통해 다른 모뎀과의 연결을 설정했습니다 (따라서 보내는 모든 것은 원격 모뎀으로 전송할 데이터로 취급됩니다)

이 중 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

이용 가능한 직렬 포트를 감지 할 수 있으며, 시도 내부에서 그들과 통합하려고 시도 할 수 있습니다 ... 캐치 블록.

이것은 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 이벤트 핸들러를 처리하는 것입니다.

일부 장치는 연결 및 전원을 켜면 DSR을 높이고 다른 장치는 CTS, 다른 장치는이를 악수로 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top