직렬 포트 커뮤니케이션 : 직렬 포트 Datareceived 이벤트를 사용한 폴링 직렬 포트 대

StackOverflow https://stackoverflow.com/questions/644623

  •  22-07-2019
  •  | 
  •  

문제

CF2.0의 C#의 직렬 포트와 통신하기 위해 작성한 코드를 검토하고 있습니다. 신뢰할 수 없기 때문에 Datareceived 이벤트를 사용하지 않습니다. MSDN은 다음을 명시합니다.

Datareceived 이벤트는 모든 바이트에 대해 제기되는 것이 아닙니다. ByTestoread 속성을 사용하여 버퍼에 읽을 데이터의 양을 결정하십시오.

Port에 read ()로 포트를 폴링하고 데이터를 읽을 때 처리하는 대의원이 있습니다. 나는 또한 "폴링이 나쁘다"는 어딘가에 읽었습니다 (설명이 주어지지 않음).

폴링이 나쁜 이유가 있습니까? 일반적인 스레딩주의 외에도 - 포트를 폴링하는 별도의 스레드 (배경 스레드)가 있습니다. 데이터를 읽은 후에 나사산이 종료되어 모든 테스트 및 잘 작동합니다.

도움이 되었습니까?

해결책

내가 읽은 방식은 바이트 당 하나의 이벤트가 아닌 여러 바이트에 대한 하나의 이벤트를 얻을 수 있습니다. 나는 데이터가 준비되었을 때 이벤트를 얻을 것으로 예상되며 일부 바이트를 완전히 "건너 뛰지"않습니다.

나는 항상이 이벤트를 사용했으며 문제가 없었습니다.

다른 팁

기존의 지혜는 "폴링은 나쁘다"고 종종 CPU가 결합 된 과정이기 때문에 종종 결국 나쁘다. 차단 I/O가 대신 사용되면 이벤트가 발생할 때까지 CPU를 다른 프로세스에 사용할 수 있습니다.

즉, 일반적으로 문자가 없을 때 돌아 오기 전에 여론 조사가 (짧은) 타임 아웃을 기다릴 수 있도록 물건을 설정할 수 있습니다. 적절한 시간 초과가 선택되면 간단한 폴링 루프는 CPU 시간이 크게 줄어들고 다른 프로세스도 실행됩니다.

나는 C#의 직렬 포트를 전혀 사용하지 않았지만 문서가 의미하는 바를 추측 할 것입니다.

Datareceaved 이벤트는 모든 바이트에 대해 제기되지는 않습니다. ByTestoread 속성을 사용하여 버퍼에 읽을 데이터의 양을 결정하십시오.

캐릭터 당 하나의 이벤트를 얻을 수 없다는 것입니다. 어떤 상황에서는 둘 이상의 캐릭터가있는 이벤트를 제공 할 수 있습니다. 이벤트 핸들러에서 사용 가능한 모든 문자를 검색하면 모두 잘됩니다.

편집하다: 독자 스레드에서 차단 호출을하는 것이 전반적으로 가장 좋은 답변 일 수 있습니다. 문자가 도착할 때까지 스레드가 차단되기 때문에 그 자체로 폴링이 아닙니다. 고정 크기 덩어리가 아닌 데이터를 처리 해야하는 경우 버퍼 크기와 일부 직렬 포트 설정을 조정해야 할 수도 있습니다.

차단 읽기 호출을 사용하더라도 기본 직렬 포트 드라이버 코드가 인터럽트 중심이라고 확신합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top