2011-08-31 2 views
0

.Net의 SerialPort 클래스를 래핑하여 래퍼 클래스를 사용하여 모뎀 작업 및 데이터 흐름을 수행합니다. SerialPort 객체에서 읽을 때 이전에 포트에 쓴 데이터가 수신 버퍼에서 발견됩니다. SerialPort 객체로 변경할 수있는 동작입니까? 내 보내는 데이터가 수신 버퍼에서 끝나지 않도록하는 클래스의 속성을 찾지 못했습니다.SerialPort 데이터 쓰기가 수신 버퍼에서 종료됩니다.

나는 데이터를 기록 할 수 SerialPort.Write()를 사용하고이 내가 아니라 편집증이 아닌 것 때문에 나는 비 블로킹 방식으로 데이터를 읽고 데이터

private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    Task.Factory.Startnew(() => WriteToBuffer()); 
} 

// ... 

private void WriteToBuffer() 
{ 
    string data = string.Empty; 

    lock(_serialPort) 
    { 
     StringBuilder sb = new StringBuilder(); 

     while(_serialPort.BytesToRead > 0) 
     { 
      sb.Append(_serialPort.ReadExisting()); 
     } 

     data = sb.ToString(); 
    } 

    // .. then do some additional processing 
} 

을 읽을 할 것입니다 모든 데이터 수신 이벤트를 놓치고 클라이언트 코드가 어떤 유형의 타임 아웃이 있다고 생각하게합니다.

ATE0을 전송하여 Hayes AT 명령이 수신 버퍼로 복사되는 것을 방지 할 수 있지만 모뎀이 원격 모뎀에 연결된 후에 보내는 데이터는 여전히 수신 버퍼로 들어온다.

내가 할 수 있는게 있습니까? 때로는 한 번에 한 바이트 씩 읽고 반환 된 데이터의 일부이기 때문에 버퍼에서 마지막으로 쓴 것을 확인하고 무시하는 것은 어렵습니다. 예를 들어 "ID 123"과 같은 것을 보내면 while 루프에서 "ID"를 읽고 0 바이트가 읽혀서 거기서 멈추는 것을 알 수 있습니다. 나는 매번 Thread.Sleep()을 호출 할 수 있다는 것을 알고 있지만 좋은 연습은 아닐 것이라고 생각합니다.

모든 모뎀에서 이러한 반향 현상이 발생할 것으로 기대합니까? 그렇다면 작성한 데이터를 필터링하는 코드를 추가 할 수 있습니다.

+0

'울리는 소리'같은 소리가납니다. 'SerialPort' 클래스에서 사용할 수 있다면 리콜 할 수 없지만 대부분의 애플 리케이션은 그 옵션을 가지고 있습니다. 당신이 그것을 끌 수 있는지보십시오. – leppie

+0

네, 그게 내 문제이고 내가 "꺼"수있는 유일한 것은 AT 명령을 울리는 것입니다. 다른 모든 것은 되돌아 간다. 그리고 그 문제를 내 앱에 추가하려고합니다. – jlafay

+0

"전이중"모드라고합니다. 어떤 장치를 사용하든 하프 듀플렉스로 구성해야합니다. 그것은 장치의 설명서를 확인하는 데 걸리는 것이 틀림 없습니다. echo-ed 명령을 필터링하기 위해 코드를 작성하는 것도 가능합니다. –

답변

0

나는 소수의 다른 모뎀을 시험해 보았고 입력 데이터를 입력 버퍼에 반환했지만 원래 시도한 모뎀 모델과 비슷했다. 내 솔루션은 원격 모뎀에서 오는 다른 데이터를 올바르게 읽도록 작성된 데이터를 필터링하는 것이 었습니다.