수신 버퍼 크기는 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 피트 케이블의 길이가 있습니다. 그 이상은 정의되지 않습니다. 속도가 높을수록 일반적으로 케이블 (커패시턴스가 낮아짐)이 좋고 케이블 길이가 짧아야합니다. 모터, 모터 인버터, 라이브 케이블 등과 같은 다른 '잡음이 많은'제품 근처에서 차단되는지 확인하십시오.
while 루프 내에서'ReadByte '외에 무엇을합니까? 처리 시간은 얼마나 걸립니까? –
직렬 포트에서 바이트를 읽은 후 버퍼가 12 바이트에 도달 할 때까지 버퍼에 넣습니다. 일단 12 바이트에 도달하면 정의 된 명령과 비교되어 매우 짧은 시간이 소요됩니다. – user209293
아직 흐름 제어를 사용하고 있지 않다면 사용하고 있는지 확인해야합니다. –