필자는 시리얼 통신 (예 : 물리적 또는 에뮬레이트 된 직렬 포트의 RS-232/RS-422)을 통해 외부 장치와 연결된 컴퓨터를 보유하고 있습니다. 빈번한 데이터 교환 (30Hz)으로 통신하지만 작은 데이터 패킷 (각 패킷 당 16 바이트 미만) 만 있으면 서로 통신합니다.최소 지연의 직렬 통신
통신의 가장 중요한 요구 사항은 송신 대기와 수신 대기 사이의 대기 시간이 짧거나 지연되는 것입니다.
데이터 교환 패턴은 핸드 셰이크와 유사합니다. 하나의 호스트 장치가 통신을 시작하고 클라이언트 장치에서 통지를 계속 보냅니다. 클라이언트 장치는 가능한 한 빨리 호스트 장치로부터 모든 통지에 응답해야합니다 (정확히 낮은 대기 시간을 달성해야하는 위치 임). 알림 및 응답의 데이터 패킷은 잘 정의되어 있습니다. 즉 데이터 길이가 알려져있다. 기본적으로 데이터 손실은 허용되지 않습니다. 나는 내가 할 공통의 승리 API 함수를 다음 사용했다
/O 동기 방식으로 읽기/쓰기 : 를 CreateFile, ReadFile을,의 WriteFile
클라이언트 장치는 호스트 장치에서 데이터를 읽을 ReadFile을 사용합니다. 클라이언트가 길이가 알려진 전체 데이터 패킷을 읽으면 WriteFile을 사용하여 데이터 패킷에 따라 호스트 장치에 응답합니다. 읽기 및 쓰기는 항상 동시성없이 순차적입니다.
어쨌든 의사 소통이 충분히 빠르지 않습니다. 즉, 데이터 송수신 사이의 시간이 너무 오래 걸립니다. 직렬 포트 버퍼링 또는 인터럽트 문제가 될 수 있습니다.
여기서 지연을 개선하기위한 몇 가지 가능한 조치를 요약합니다. 나에게 FILE_FLAG_NO_BUFFERING 플래그 몇 가지 제안 및 수정 :
- 전화를 CreateFile을주십시오? 이 플래그가이 컨텍스트와 관련이 있는지 확실하지 않습니다.
- 각 WriteFile 이후에 FlushFileBuffers를 호출 하시겠습니까? 또는 데이터를 즉시 전송하기 위해 직렬 포트를 알리고 인터럽트 할 수있는 모든 동작?
- 은 직렬 통신을 처리하는 스레드 및 프로세스에 대해 더 높은 우선 순위를 설정합니다.
- 에뮬레이트 된 장치 (드라이버가있는)의 대기 시간 타이머 또는 전송 크기를 설정합니다. 그러나 실제 직렬 포트는 어떻습니까?
- Linux의 setserial/low_latency와 비슷한 Windows의 모든 항목이 비슷합니까?
- FIFO를 사용하지 않도록 설정 하시겠습니까?
미리 감사드립니다.
[timeouts] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363437%28v=vs.85%29.aspx)를 조정하려고 했습니까? "충분히 빠르지"않은 것은 정확히 무엇입니까? 겹친 IO, 이벤트 중심 ... ...? – dyp
이것은 하드웨어에 달려 있습니다. USB 직렬 포트, 직렬 포트 카드 또는 마더 보드에있는 카드를 사용하고 있습니까? –
시간 제한 설정이 내 경우에 도움이되지 않을 수 있습니다.내 장치는 매우 낮은 대기 시간으로 일부 핸드 셰이크와 유사한 데이터 교환을 수행해야하며 데이터 손실을 허용하지 않습니다. "충분히 빠르지 않음"은 한 장치에서 데이터를 전송하고 다른 장치에서 데이터를 수신하는 데 걸리는 시간이 너무 오래 걸린다는 것을 의미합니다. – elgcom