2010-12-31 7 views
1

COM2 포트에서 데이터를 수신하기 위해 C# 프로그램을 작성했습니다. 전송 속도는 115200으로 설정됩니다. 전송자는 115200bps로 데이터를 전송합니다. 내 프로그램은 종종 몇 바이트를 잃어 가고있다. com 포트에서 while(true) 루프의 데이터를 읽는 방법은 ReadByte입니다.C# 직렬 포트 데이터 손실

전송 속도가 높게 설정되어
  • , 나는 데이터가 손실 될 것으로 예상한다 :

    내가 몇 가지 질문이? 그렇다면 왜?

  • 내가 100 * 1024 * 1024로 readbuffer 크기를 설정하고 있습니다. 직렬 드라이버 버퍼 크기를 100 * 1024 * 1024로 설정합니까?

이 문제를 디버깅하는 방법에 대한 의견이 있으십니까?

+2

while 루프 내에서'ReadByte '외에 무엇을합니까? 처리 시간은 얼마나 걸립니까? –

+0

직렬 포트에서 바이트를 읽은 후 버퍼가 12 바이트에 도달 할 때까지 버퍼에 넣습니다. 일단 12 바이트에 도달하면 정의 된 명령과 비교되어 매우 짧은 시간이 소요됩니다. – user209293

+1

아직 흐름 제어를 사용하고 있지 않다면 사용하고 있는지 확인해야합니다. –

답변

3

전송 속도를 높게 설정하면 데이터가 손실 될 수 있습니까? 그렇다면 왜?

반드시 그렇지는 않습니다. 잘못된 물리적 연결 (너무 길어서) 때문에 발생할 수 있습니다.

내가해야 * 1024

100 * 1024 (방법) 충분 같이 저는 ReadBuffer 크기를 설정하고있다.

1 바이트를 루핑하고 읽는 것이 포트를 읽는 가장 효율적인 방법은 아닙니다.

DataReceived 이벤트에 연결하여 ReceivedBytesThreshold = 12로 설정할 수 있습니다. 그렇게하면 항상 읽을 수 있습니다 (버퍼, 0, 12)

4

수신 버퍼 크기는 100 * 1024 * 1024입니다. 나는 정말로이 크기가 필요하다는 것을 진지하게 생각할 것이다. 물론 실제 직렬 포트 버퍼가 아닐지도 모른다.

수신자의 실제 수신 버퍼가 오버플로되어있을 수 있으므로 흐름 제어를 사용해 봐야 할 수 있습니다. 이렇게하면 수신자가 송신자에게 효과적으로 말할 수 있습니다. "잠시만 기다려주세요. 송신을 중단하고 내가 가진 것을 처리하겠습니다."

하드웨어 흐름 제어는 RTS (Request To Send) 및 CTS (Clear To Send) 핀을 통해 (일반적으로) 사용됩니다.

좀 더 자세히 설명하는 this 문서를 확인하십시오.

직렬 포트의 ReceivedBytesThreshold 속성을 기본값 인 1로 설정 한 다음 DataReceived 이벤트를 처리하는 것이 좋습니다. 누가 내일 20 바이트 또는 5 바이트의 메시지를 읽어야 할지를 아는 사람이있을 것입니다. 앞으로는 가변 길이의 메시지를 읽어야 할 것입니까? 임계 값을 1로 유지하면 현재, 미래에 수신 될 모든 바이트를 처리 할 수 ​​있습니다.

버퍼 적어도 1 바이트가있을 때 발광하는 이벤트를 의미한다이 임계. 어쩌면 더 많을 수도 있고 아마도있을 것입니다. NOT은 반드시 수신 된 모든 단일 바이트에 대해 실행된다는 것을 의미합니다.각 이벤트에서 BytesToRead 속성을 확인하고이 속성을 사용자의 버퍼로 읽어야합니다.

이벤트가 가 아닌이 수신 될 때마다 반드시 반복적으로 실행됩니다.

또한 DataReceived 이벤트 처리기에서 가능한 한 작은 작업을 수행하는 것이 가장 좋습니다. 버퍼에 수신 된 모든 바이트를 읽고, 추가 처리를 위해 완성 된 메시지를 대기열에 추가하지만 나머지는 거의 수행하지 않습니다.

또한 RS232표준 최대 스펙 19200의 속도로 50 피트 케이블의 길이가 있습니다. 그 이상은 정의되지 않습니다. 속도가 높을수록 일반적으로 케이블 (커패시턴스가 낮아짐)이 좋고 케이블 길이가 짧아야합니다. 모터, 모터 인버터, 라이브 케이블 등과 같은 다른 '잡음이 많은'제품 근처에서 차단되는지 확인하십시오.

+1

+1 흐름 제어 권장 +1 –

+0

데이터 수신 이벤트를 추가하고 수신 바이트 thresold를 1로 설정했습니다. 다른 스레드가이 수신 이벤트의 영향을 받았다는 것을 알았습니다. 그렇게 될 수 있습니까? 타이머 이벤트를 발생시키는 4 개의 타이머. 타이머가 정의되어 있습니다. 직렬 포트가 수신 되 자마자 타이머 이벤트는 정의 된 간격으로 실행되지 않습니다 .1은 1 또는 2 초 오프셋됩니다. – user209293