2011-09-09 10 views
0

Visual Studio C#에서 프로젝트 작업 중입니다.지연 수신 데이터 수신 차단

시리얼 포트를 통해 PC에 연결된 장치에서 데이터를 수집 중입니다. 먼저 요청 명령을 보내고 응답을 기다립니다. 요청 명령을 보낸 후 응답 할 장치가 1 초 지연됩니다. 장치에 도달하지 못하고 때때로 응답하지 않을 수 있습니다. 응답을 기다리고 다음 데이터 요청 명령을 일찍 보내지 않으려면 System.Threading.Thread 메서드를 사용하여 지연을 만듭니다.

지연 시간을 길게 설정하면 직렬 포트 데이터 수신이 느슨합니다.

내가 사용하는 딜레이 (Delay) 기능은 다음과 같습니다

private void Delay(byte WaitMiliSec) 
    { 
     // WaitTime here is increased by a WaitTimer ticking at every 100msec 

     WaitTime = 0; 
     while (WaitTime < WaitMiliSec) 
     { 
      System.Threading.Thread.Sleep(25); 
      Application.DoEvents(); 
     } 
    } 
+0

DataReceived 이벤트를 사용할 수 없습니까? http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx –

+0

아니 당신은 시리얼 포트를 잃지 않을거야하지만 당신이 thread.sleep 덜 확인하고 포트 연결을 확인하는 것이 좋습니다 그렇지 않다면 예를 들어 데이터 포트를 호출하고 그렇지 않으면 연결되지 않고 데이터가 수신되지 않을 때 반복적으로 호출하는 재귀 함수에 넣습니다. –

답변

2

더 - 당신은 모든 데이터를 잃게되지 않습니다 - 시리얼 포트는 모든 응용 프로그램에 의존하지 않는 자신의 버퍼없는거야.하지 OS와 하드웨어가이를 처리합니다.

저는 리팩토링 담당자에게 데이터 보내기/받기가 자신의 작업/스레드임을 제안합니다. 그렇게하면 필요하지 않습니다. Application.DoEvents();

보내기/받기 코드를 더 게시하면 도움이 될 것입니다.

추신 : 내 코드는 아무렇게나 작동하지 않을 것입니다. (WaitTime은 항상 0입니다.)하지만 단지 스 니펫 일뿐입니다.

+0

답변 해 주셔서 감사합니다. –

+0

답변 해 주셔서 감사 드리지만 리팩토링을받지 못했습니다. 내가 말했듯이 장치가 응답하지 않을 수 있습니다. 그래서 나는 보내고 받았다. 명령을 보내고 1 초 동안 기다렸다가 다음 명령을 계속 보냅니다. 장치에서 반환이 발생하면 serialPort1_DataReceived라는 serialPort 구성 요소 자체 기능을 통해 캡처됩니다. 수신 된 데이터가 거기에서 평가됩니다. 그런데 지연이 효과가 있지만 작동하지 않는 것처럼 보입니다. –

+0

리팩토링은 동작을 변경하지 않는 코드의 변경 사항을 단순히 조정합니다. 모든 것을 스레드/작업 내부에 넣고 연결을 확인하고 명령을 보내고 데이터가 avaiable 또는 시간 초과 될 때까지 기다린 다음 데이터를 수신/처리하거나 별도의 스레드에서 중단하여 UI를 차단하지 않도록합니다. – Carsten

관련 문제