다음을 통해 공유


SERIAL_TIMEOUTS 구조체(ntddser.h)

SERIAL_TIMEOUTS 구조체는 직렬 포트에 의한 읽기 및 쓰기 작업에 대한 제한 시간 매개 변수를 지정합니다.

구문

typedef struct _SERIAL_TIMEOUTS {
  ULONG ReadIntervalTimeout;
  ULONG ReadTotalTimeoutMultiplier;
  ULONG ReadTotalTimeoutConstant;
  ULONG WriteTotalTimeoutMultiplier;
  ULONG WriteTotalTimeoutConstant;
} SERIAL_TIMEOUTS, *PSERIAL_TIMEOUTS;

멤버

ReadIntervalTimeout

읽기 작업에서 연속된 두 바이트 사이에 허용되는 최대 시간(밀리초)입니다. 이 최대 시간 초과를 초과하는 읽기 작업입니다. 이 최대값은 첫 번째 바이트의 읽기 이전 시간 간격에는 적용되지 않습니다. 값이 0이면 간격 제한 시간이 사용되지 않음을 나타냅니다. 자세한 내용은 설명 부분을 참조하세요.

ReadTotalTimeoutMultiplier

읽기 작업에서 바이트당 허용되는 최대 시간(밀리초)입니다. 이 최대 시간 초과를 초과하는 읽기 작업입니다. 자세한 내용은 비고를 참조하세요.

ReadTotalTimeoutConstant

읽기 작업당 허용되는 최대 추가 시간(밀리초)입니다. 이 최대 시간 초과를 초과하는 읽기 작업입니다. 자세한 내용은 비고를 참조하세요.

WriteTotalTimeoutMultiplier

쓰기 작업에서 바이트당 허용되는 최대 총 시간(밀리초)입니다. 이 최대 시간 초과를 초과하는 쓰기 작업입니다. 자세한 내용은 비고를 참조하세요.

WriteTotalTimeoutConstant

쓰기 작업당 허용되는 최대 추가 시간(밀리초)입니다. 이 최대 시간 초과를 초과하는 쓰기 작업입니다. 자세한 내용은 비고를 참조하세요.

설명

SERIAL_TIMEOUTS 구조는 IOCTL_SERIAL_SET_TIMEOUTSIOCTL_SERIAL_GET_TIMEOUTS I/O 제어 요청에 사용됩니다. IOCTL_SERIAL_SET_TIMEOUTS I/O 컨트롤 요청은 이 구조를 사용하여 읽기 및 쓰기 작업에 사용할 직렬 포트에 대한 제한 시간 매개 변수 집합을 지정합니다. IOCTL_SERIAL_GET_TIMEOUTS I/O 컨트롤 요청은 이 구조를 사용하여 이전 IOCTL_SERIAL_SET_TIMEOUTS 요청에 의해 설정된 제한 시간 매개 변수를 검색합니다.

지정된 바이트 수가 전송되거나 요청된 읽기 또는 쓰기 작업이 시간 초과되면 읽기 또는 쓰기 요청이 성공적으로 완료됩니다. 요청은 지정된 바이트 수를 전송했음을 나타내는 STATUS_SUCCESS 상태 코드를 반환합니다. 요청은 작업 시간이 초과되었음을 나타내는 STATUS_TIMEOUT 상태 코드를 반환합니다.

IRP_MJ_READ 요청이 Nttl 바이트 길이인 읽기 작업을 지정하는 경우 직렬 포트에서 작업을 완료할 수 있도록 허용하는 최대 시간 Tm은 다음과 같이 계산됩니다.

Tm = Nttl * ReadTotalTimeoutMultiplier + ReadTotalTimeoutConstant

이 최대값을 초과하는 읽기 요청은 제한 시간이 발생할 때 완료되고 STATUS_TIMEOUT 상태 코드를 반환합니다. I/O 상태 블록의 정보 필드는 제한 시간이 발생하기 전에 성공적으로 읽은 바이트 수를 나타냅니다.

IRP_MJ_WRITE 요청이 Nttl 바이트 길이인 쓰기 작업을 지정하는 경우 직렬 포트에서 작업을 완료할 수 있도록 허용하는 최대 시간 Tm은 다음과 같이 계산됩니다.

Tm = Nttl * WriteTotalTimeoutMultiplier + WriteTotalTimeoutConstant

이 최대값을 초과하는 쓰기 요청은 제한 시간이 발생할 때 완료되고 STATUS_TIMEOUT 상태 코드를 반환합니다. I/O 상태 블록의 정보 필드는 제한 시간이 발생하기 전에 성공적으로 작성된 바이트 수를 나타냅니다.

읽기 또는 쓰기 작업이 완료될 수 있는 최대 Tm 시간은 항상 클라이언트가 요청을 제출할 때가 아니라 직렬 포트가 요청된 작업을 시작할 때부터 측정됩니다.

ReadIntervalTimeout, ReadTotalTimeoutMultiplierReadTotalTimeoutConstant가 모두 0이면 읽기 작업이 시간 초과되지 않습니다. WriteTotalTimeoutMultiplierWriteTotalTimeoutConstant가 모두 0이면 쓰기 작업이 시간 초과되지 않습니다.

ReadIntervalTimeout이 0이면 읽기 작업의 연속 바이트 사이에 최대 간격이 없으며 시간 제한은 ReadTotalTimeoutMultiplierReadTotalTimeoutConstant 멤버만을 기반으로 합니다.

ReadTotalTimeoutMultiplierReadTotalTimeoutConstant가 모두 0이고 ReadIntervalTimeout이 MAXULONG보다 작고 0보다 큰 경우 연속적으로 수신된 바이트 쌍 간의 간격이 ReadIntervalTimeout을 초과하는 경우에만 읽기 작업이 시간 초과됩니다. 이러한 세 개의 제한 시간 값이 사용되고 읽기 요청이 포트로 전송될 때 직렬 포트의 입력 버퍼가 비어 있는 경우 이 요청은 포트가 1 바이트 이상의 새 데이터를 수신할 때까지 시간 초과되지 않습니다.

ReadIntervalTimeout이 MAXULONG으로 설정되어 있고 ReadTotalTimeoutConstantReadTotalTimeoutMultiplier가 모두 0이면 바이트가 수신되지 않은 경우에도 이미 수신된 바이트로 읽기 요청이 즉시 완료됩니다. 이 경우 읽기 요청은 STATUS_SUCCESS 상태 코드를 반환합니다.

ReadIntervalTimeoutReadTotalTimeoutMultiplier가 모두 MAXULONG으로 설정되고 ReadTotalTimeoutConstant가 0보다 크고 MAXULONG보다 작은 값으로 설정된 경우 읽기 요청은 다음과 같이 작동합니다.

  • 직렬 포트의 입력 버퍼에 바이트가 있는 경우 읽기 요청은 버퍼에 있는 바이트로 즉시 완료되고 STATUS_SUCCESS 상태 코드를 반환합니다.
  • 입력 버퍼에 바이트가 없는 경우 직렬 포트는 바이트가 도착할 때까지 기다렸다가 1바이트 데이터로 읽기 요청을 즉시 완료하고 STATUS_SUCCESS 상태 코드를 반환합니다.
  • ReadTotalTimeoutConstant에서 지정한 시간 내에 바이트가 도착하지 않으면 읽기 요청 시간이 초과되고 I/O 상태 블록의 정보 필드가 0으로 설정되고 STATUS_TIMEOUT 상태 코드가 반환됩니다.
ReadIntervalTimeoutReadTotalTimeoutConstant가 모두 MAXULONG으로 설정된 경우 IOCTL_SERIAL_SET_TIMEOUTS 요청이 실패하고 INVALID_PARAMETER 오류 상태 코드를 반환합니다.

데이터 스트림의 길이를 미리 알 수 없는 경우 읽기 간격 제한 시간을 사용하여 들어오는 데이터 스트림의 끝을 검색할 수 있습니다. 읽기 요청이 이 기술을 사용하는 경우 STATUS_TIMEOUT 완료 상태 코드는 일반적으로 요청이 성공적으로 완료되었음을 의미합니다.

읽기 간격 제한 시간은 들어오는 바이트 사이의 간격이 ReadIntervalTimeout 값을 초과할 때 발생합니다. 시간 제한 간격은 시스템 클록을 기준으로 측정되며 시간 제한 측정의 정확도는 시스템 클록의 세분성에 의해 제한됩니다. 따라서 이 간격의 시작 시간과 종료 시간이 시스템 클록 틱 간에 정확히 어디에 속하는지에 따라 한 시스템 클록 틱 이전과 지정된 제한 시간 간격보다 늦게 한 틱 간에 시간 초과가 발생할 수 있습니다. 다른 디바이스에 대한 인터럽트 처리로 인해 시스템 클록 인터럽트 처리가 지연되는 경우에도 시간이 초과될 수 있습니다. 지정된 시간 제한 간격이 시스템 클록 틱 사이의 기간에 가깝거나 작은 경우 지연 없이 즉시 시간 초과가 발생할 수 있습니다.

더 작은 시간 제한 간격을 보다 정확하게 측정하는 가능한 방법은 시스템 클록 틱 사이의 시간을 줄이는 것이지만 그렇게 하면 전력 소비가 증가할 수 있습니다. 또한 플랫폼의 다양한 드라이버에 의한 인터럽트 관련 처리가 시스템 클록 인터럽트 처리를 지연시키지 않도록 보장할 수 없다면 시스템 클록 기간을 줄이면 시스템 클록 세분성을 안정적으로 달성하지 못할 수 있습니다.

SERIAL_TIMEOUTS 구조체는 사용자 모드 SetCommTimeouts 및 GetCommTimeouts 함수에서 사용되는 COMMTIMEOUTS 구조체와 유사합니다.

자세한 내용은 직렬 디바이스에 대한 읽기 및 쓰기 시간 제한 설정을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000부터 지원됩니다.
머리글 ntddser.h

추가 정보

COMMTIMEOUTS

GetCommTimeouts

IOCTL_SERIAL_SET_TIMEOUTS

IRP_MJ_READ

IRP_MJ_WRITE

SerCxGetReadIntervalTimeout

SetCommTimeouts