2013-07-11 2 views
5

저는 최근에 SerialPort 클래스로 많은 작업을 해왔습니다. 현재 장치가 내 응용 프로그램에서 사용하는 통신 포트에 연결되어 있는지 확인하는 적절한 방법을 알아 내려고하고 있습니다. 장치가 통신 포트에 연결되어 있는지 확인하는 적절한 방법이 있습니까? 내 현재 방법은 다음과 같습니다 :C# Serial Port 장치가 연결되어 있는지 확인하십시오.

  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); 

그것은 작동하지만 나는 약간의 해킹과 신뢰할 수 없다고 느낍니다. 필요하다면 나는 그것을 지킬 수 있지만 이것을하기위한 적절한 대안이 있다면 나는 그것을 원한다.

편집 : 실제로 신뢰할 수 있도록 틱 값을 약 10,000으로 설정해야합니다. 그렇지 않으면 나는 때때로 데이터를받지 못한다. 1000 또는 5000으로 설정하는 것조차 신뢰할 수 없습니다. 그럼에도 불구하고 여러 대의 컴퓨터에서 신뢰할 수 있다는 보장은 없습니다.

+0

당신이뿐만 아니라 장치를 프로그래밍하고 (의사 코드) 요약하면? – Rubixus

+0

@Rubixus No. Fluke 5500A 다중 제품 교정기라고 불리는 의료 기기입니다. 나는 내부 설정을 직접 변경하지도 않는다. – DanteTheEgregore

+0

장치를 꽂았을 때 레지스트리에 드라이버가 등록됩니까? USB 장치입니까? – Kcvin

답변

7

너무 직렬 포트로 작업해야하며 고통이 있다고 생각합니다. 장치가 연결되어 있는지 확인하는 내 방법은 대개 폴링 명령을 실행하는 것입니다. 메서드가 작동하는 동안 도움이되지만 이벤트가 충분할 때 while 루프를 사용하지 않으려 고합니다.

닷넷 직렬 포트 클래스

는 몇 가지 유용한 이벤트를 제공

Serial.DataReceivedSerial.ErrorReceived

Serial.Write 보통 내가 장치가 연결되어 있는지 확인하기 위해 지정된 간격으로 폴링 명령을 실행한다. 장치가 응답하면 DataReceived 이벤트가 발생하고 이에 따라 응답을 처리 할 수 ​​있습니다 (다른 필요한 데이터와 함께). 간단한 타이머 또는 증가 된 변수와 함께 사용하여 응답 시간을 측정 할 수 있습니다. 참고 : ReadTimeoutWriteTimeout 값을 적절하게 설정해야합니다.이 내용은 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) 
0

어떤 장치가 연결되어있어 '>'를 보낼 수 있기 때문에 해커라고 생각합니다. 그러나 그것은 당신의 장치를 의미하지는 않습니다.

대신 동적이면서 SerialPort.GetPortNamesWMI Queries과 같은 것을 사용하여 COM 포트에 연결된 장치를 확인하십시오.

시작 지점으로 this 예제를 사용할 수 있습니다.

설명서와 예제를 읽은 후에는 컴퓨터와 연결된 COM 포트에 드라이버를 등록하는 모든 장치 정보 목록을 만들 수 있어야합니다.

편집 :

장치가 자신을 등록하지 않기 때문에, 작업을 많이 쉽게 만들 수있는 비주얼 스튜디오의 product drivers보고 고려하십시오.

+0

'>'장치가 명령을 실행하고 모든 것이 버퍼에 기록되었음을 나타내는 토큰 문자입니다. 장치가 연결되어 있는지 확인하기위한 나의 현재 방법은 설정된 시간 동안 기다린 다음받은 문자열에 빈 문자열 이상이 포함되어 있는지 확인하는 것입니다. 문제는 좋은 컴퓨터에서 데이터가 수신되기 전에 틱 값이 10,000 번 증가 할 수 있다는 것입니다. 내가 쉽게 의존 할 수있는 것이 아닙니다. – DanteTheEgregore

+0

이 방법은 OP가 지정한 RS232가 아닌 USB 직렬 장치에서만 작동합니다. – Rubixus

+0

@Rubixus 그것이 제가 준 예입니다. 드라이버가 설치된 장치에서 WMI 쿼리를 사용할 수 있습니다. 드라이버가 설치되면 장치 관리자에 표시됩니다. 장치 관리자에있는 경우 WMI 쿼리를 사용하여 장치 관리자를 찾을 수 있습니다. 그래서 귀하의 의견도 유효하지 않습니다. – Kcvin

2

불행하게도 직렬 포트를 사용하면 특정 장치가 연결되어 있는지 확인할 수있는 적절한 방법이 없습니다. 장치가 올바르게 응답한다는 마법 메시지를 쓸 수도 있지만 this answer에 설명 된 것처럼이 방법을 사용하면 연결된 다른 장치에 문제가 발생할 수 있습니다.

궁극적으로 사용자가 올바른 포트를 선택해야합니다.

또한 장치에 대한 연결이 끊어지면 읽거나 쓰지 못할 때만 알 수 있습니다. 이 경우 LostConnection 이벤트를 발생시킵니다.

+0

장치에 드라이버가있는 경우 내 대답에 명시된대로 WMI 쿼리를 사용하여 장치를 식별 할 수 있습니다. 이 대답은 오해의 소지가 있습니다. 드라이버가없는 경우 드라이버 작성, 직접 작성 및 장치 검색을 배울 수 있습니다. – Kcvin

+0

@NETscape RS232 장치의 경우 WMI 쿼리가 작동하지 않습니다. – Rubixus

+1

@NETscape 나는 대답이 잘못되었다고 생각하지 않는다. 그는 위대한 지적을합니다. 직렬 연결은 극히 불확실합니다. 그들은 작업하기가 다소 어려울 수 있습니다. 드라이버 arent '정말 옵션. – DanteTheEgregore

관련 문제