2013-08-21 2 views
1

직렬 포트에서 데이터를 읽거나 쓰려면 스트림 클래스를 사용하고 싶습니다. BaseStream을 사용하여 스트림 (아래 링크)을 가져 오지만 Length 속성이 작동하지 않습니다. 아무도 얼마나 많은 바이트가 있는지 모른 채 전체 버퍼를 읽을 수있는 방법을 알고 있습니까?길이가없는 SerialPort.BaseStream에서 바이트를 읽는 방법

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.basestream.aspx

답변

2

수 없습니다. 즉, 가지고있는 것이 모두 BaseStream이면 모든 것을 받았음을 보장 할 수는 없습니다.

  1. 패킷의 첫 번째 2 또는 4 바이트로 길이 단어를 보내기 :

    당신이 모든 것을받은 있는지 알 수있는 두 가지 방법이 있습니다. 얼마나 많은 바이트가 뒤 따를 지 말입니다. 그런 다음 독자는 해당 길이의 단어를 읽고 그 많은 바이트를 읽고 그것이 완료되었음을 알게됩니다.

  2. 레코드 구분 기호에 대해 동의합니다. 그것은 텍스트에 잘 작동합니다. 예를 들어 널 바이트 또는 줄 끝 문자가 데이터의 끝을 알리는 지 결정할 수 있습니다. 이것은 임의의 바이너리 데이터로하는 것이 다소 어렵지만 가능합니다. 의견보기.

또는 애플리케이션에 따라 어떤 타이밍을 수행 할 수 있습니다. 즉, X 초 (또는 밀리 초) 동안 새로운 것을받지 못했다면 모든 것을받은 것으로 간주합니다. 그것은 송신자가 특히 느린 경우 잘 작동하지 않는 명백한 단점이 있습니다.

+0

레코드 분리 기호는 바이트 스터핑 *과 함께 바이너리 데이터와 함께 자주 사용됩니다. 개인적으로, 나는 두 가지 방법을 함께 사용하여 오류가 발생하면 다시 동기화 할 수 있습니다. –

+0

@BenVoigt : 좋은 지적입니다. –

+0

조작 할 수없는 통신 프로토콜을 사용하고 있습니다. : –

0

어쩌면 당신은 SerialPort.BytesToRead 속성을 시도 할 수 있습니다.

+0

스트림을 사용하여 작업을 수행하려고합니다. 데이터를 사용하여 SerialPort 클래스를 클래스로 전달할 수는 없지만 스트림 객체를 사용할 수 있습니다. –

+0

그것은 다소 어려울 것입니다. 직렬 포트 프로그래밍의 한 특징은 포트를 통해 들어오는 데이터의 길이 *를 정확히 알 수 없다는 것입니다. 적은 수의 바이트를 읽고 버퍼에 캐시하여 자신의 버퍼링 시스템을 구현해야 할 수도 있습니다. – nim

관련 문제