2012-03-05 5 views
0

documentation for the Serial Port 상태 :직렬 포트를 통해 두 메시지 사이의 기간을 확인하는 방법

가 DataReceived 이벤트가 보장되지는 받은 모든 바이트에 대해 발생합니다. BytesToRead 속성을 사용하여 의 데이터가 버퍼에 얼마나 남았는지 확인합니다.

우리가 구현하려는 프로토콜은 유휴 기간별로 메시지를 분리합니다. 우리는 각 캐릭터의 수신 시간에 의존해야하기 때문에 .NET의 제한이 문제인 것처럼 보입니다.

누구든지 .NET의 SerialPort가 이벤트 발생 여부를 결정하는 방법을 알고 있습니다. 높은 전송 속도로 스팸 메일을 보내는 것을 피하는 것입니까?

적어도 한 번의 이벤트가 XY 밀리 ​​초 내에 발생한다는 보장이 있습니까? 최소한의 기간은 무엇입니까?

이 문제를 해결하는 방법은 무엇입니까?

EDIT : 좀 더 많은 조사에 따르면 제한 시간을 설정하여 수행 할 수 있음을 보여줍니다. 바보 야!

+0

단순히 for 호출로 for 루프를 사용하십시오. 읽고 읽을 바이트가 있는지 확인하고 메시지 경계를 검색 할 시간을 추적하십시오. 일부 높은 정밀도 수면을 사용합니다. – CodingBarfield

답변

2

메시지 사이의 간격이 최소 2 초가 아니라면 프로토콜에 대한 좋은 계획이 아닙니다. Windows는 사용자 모드에서 실행되는 코드에 대해 어떠한 종류의 서비스 보장도 제공하지 않으며 실시간 운영 체제가 아닙니다. 기계가 많이로드되고 더 높은 우선 순위로 실행되는 다른 스레드가 코드를 선점하면 코드가 실패합니다. 커널 스레드와 같습니다. 수백 밀리 초의 지연이 일반적으로 발생합니다. 특히 코드가 페이징 아웃되고 페이징 파일이 조각난 경우에는 수 초가 확실히 가능합니다. 문제를 해결하기가 매우 어려우며, 끔찍하게 반복됩니다.

대안은 간단합니다. 메시지의 시작과 끝을 확실하게 감지 할 수 있도록 메시지 주위의 프레임을 사용하면됩니다. 2 바이트가 사용됩니다. STX와 ETX가 널리 사용됩니다. 메시지 끝 바이트가 데이터에도 나타날 수있는 경우 길이 바이트를 추가하십시오.

관련 문제