>source

현재 Linux에서 직렬 통신을 위해 termios로 작업하고 있습니다.

문자 간 타임 아웃을 5ms로 설정해야합니다.

VMIN이 VMIN>0이고 VTIME이 0이어야하는 VMIN 및 VTIME을 사용하여 문자 간 시간 제한을 설정하는 방법을 찾았습니다.

문제는 VTIME을 5ms로 설정해야하지만 VTIME은 10 분의 1 초로 표시된다는 것입니다.

VTIME 데이터 유형은 부호없는 문자이므로 0.05로 설정할 수 없습니다.

이 문제를 해결할 방법이 있는지 아는 사람이 있습니까?


  • 답변 # 1

    와이즈 비즈

    아니요, 10ms보다 짧은 기간 제한 시간을 설정하는 방법은 없습니다.
    하드웨어 및 커널 구성에 따라, 특히 시간으로 구분 된 메시지를 감지하려는 경우이 시간 초과가 전혀 신뢰할 수 없습니다.
    termios 처리는 최소한 UART 장치 드라이버 위의 전체 계층입니다 (참조 Linux 직렬 드라이버).
    UART 드라이버의 하단 절반과 용어에 대한 kworker 스레드가 우선 순위가 높고 대기 시간이 짧도록 커널을 구성하지 않으면 짧은 문자 간격을 정확하게 또는 확실하게 결정할 수 없습니다.

    UART가 FIFO를 사용하여 수신 데이터를 버퍼링하면 해당 하드웨어는 소프트웨어가 감지 할 수있는 문자 간 간격을 흐리게합니다.
    마찬가지로 UART 드라이버가 DMA를 사용하여 수신 된 데이터를 저장하는 경우 문자 간 타이밍이 흐려집니다.
    DMA를 사용하면 CPU는 DMA 작업이 완료 될 때까지 수신 된 데이터를 처리하는 데 관여하지 않으며 문자 간 분리에 대한 모든 시간 정보가 사라집니다.
    DMA를 사용할 때 프레이밍 오류 및/또는 패리티 오류와 같은 중요한 정보는 특정 바이트를 정확히 찾아 내기가 어렵거나 불가능합니다.
    DMA가없는 경우에도 Term 플립은 tty 플립 버퍼 (와이어의 타이밍에서 제거 된 레이어)를 통한 데이터 전송에 기반한 타이밍 만 사용할 수 있습니다.

    일부 UART에는 유휴 회선으로 메시지 끝을 감지하는 데 도움이되는 하드웨어가 있습니다.
    예를 들어 Atmel/Microchip ATSAMA5 및 AT91SAM9 SoC에는 수신 된 각 프레임 이후의 유휴 시간을 측정하는 Receiver Timeout 기능이있는 USART가 있습니다.
    이 유휴 회선 시간이 지정된 값을 초과하면 인터럽트가 생성 될 수 있습니다.
    Atmel USART 용 Linux 드라이버는 일반적으로 수신기 시간 초과 인터럽트를 사용하여 현재 DMA 수신 작업을 조기에 종료하고 DMA 버퍼의 내용을 tty 플립 버퍼로 복사합니다.

    요약하면 시간으로 구분 된 메시지를 감지하기 위해 VMIN 및 VTIME 설정에만 의존하거나 의존해서는 안됩니다. 시간으로 구분 된 UART 데이터 구문 분석을 참조하십시오.
    메시지 패킷을 안정적으로 구문 분석하고 유효성을 검사 할 수 있도록 메시지 패킷에 구분 기호/센티넬 문자/바이트가 있어야합니다.
    로컬 버퍼에서 syscall을 효율적으로 사용하는 예는 직렬 포트에서 완전한 메시지 구문 분석을 참조하십시오.

    I need to set an intercharacter timeout to 5ms.
    ...
    Does anyone know if there is some way around this?

  • 이전 datetime - php - "지금"을 미래의 날짜와 비교하고 시간이 지난 경우 $var를 설정하십시오
  • 다음 javascript - 홀수 및 짝수의 숫자에 대해 가장 왼쪽의 숫자를 가장 잘 결정하는 방법