2013-02-10 5 views
4

Linux의 직렬 포트에서 BREAK 상태를 감지하고 싶습니다. 어떻게 이뤄지나요?Linux 직렬 포트에서 BREAK 상태 수신/읽기

BREAK 조건이 종료되면 이 시작될 때이를 감지하고 싶습니다.

int serial_status; 
ioctl(serial_fd, TIOCMGET, &serial_status); 

다음 브레이크 보여주는 비트 값이 될 조건을-하지만 그런 일이 없다 보인다

은 내가 그랬다면 기대.

나는 휴식을 보내는 에 대한 termios.htcsendbreak()을 발견했다. 나 또한 휴식을 보내는 방법을 설명하는 tty_ioctl man page을 발견했습니다. 그러나 휴식을 취하는 것은 어떨까요?

참고 :BRKINT이 제안되었습니다 (중단이 발생할 때 SIGINT 신호를 생성 함).

  • 나는 그것이 여러 직렬 포트 시나리오에서 오는 직렬 어떤 포트 말할 수 없다 : 그러나 SIGINT을 얻는 것은 몇 가지 이유에 대한 이러한 유용한 API는 없습니다.
  • 사용자가 터미널에서 프로그램을 실행할 때 Ctrl-C를 눌러 SIGINT을 얻을 수도 있습니다.
  • 프로그램을 데몬으로 실행하는 경우 "터미널이 포 그라운드 프로세스 그룹의 제어 터미널 인 경우"는 사실이 아닙니다.
  • BREAK 상태가 지속되는 기간과 중단되는시기를 알 수 없습니다.
+0

링크하려는'termios' 맨 페이지에서'BRKINT'를보세요. –

+1

@AntonKovalenko : 제 질문에 'BRIGINT'(SIGINT 생성)가 유용하지 않다고 말하는 메모를 추가했습니다. –

+1

비정상적인 수신 조건 (예 : 패리티 오류, 프레이밍 오류, 오버런 또는 중단)이 발생할 때 수신 버퍼에 일반적으로 채워지는 플래그 인 'TTY_BREAK'플래그에 대한 USART/UART 드라이버의 소스 코드를 검토하십시오. 그러나 * line discipline * (userland가 Rx 데이터를 받기 전에 처리의 다음 단계)은 일반적으로 Rx 데이터에서 플래그를 필터링합니다. 나는 휴식 조건을 위해 20 NUL을 삽입 한 * 라인 훈련 *의 한 버전을 모호하게 기억합니다. 아니면 3 바이트의'0xff'와'0x00'과'0x00' - http://lxr.free-electrons.com/source/drivers/char/n_tty.c?v=2.6.36#L1002 – sawdust

답변

1

내가 지금까지 발견 할 수있었습니다 가장 좋은 대답은 termios 구조 c_iflag에 대한 IGNBRKBRKINT 상수의 tcsendbreak() man page 설명에서입니다. 이 메시지 : 둘 IGNBRKBRKINT가 설정된 경우

이 휴식 그것이 시퀀스 \377 \0 \0로 판독되는 경우 PARMRK가 설정되어있는 경우를 제외하고 널 바이트 ('\0')으로 판독한다.

(즉, 0xFF 0x00 0x00입니다)

그래서 나는 아마 PARMRK을 설정해야하고, 읽기 바이트의 작은 처리를 할 수 있도록 준비 할 것 같아요. 이것은 패리티/프레이밍 오류에 대한 명시적인 정보를 제공합니다 (비록 0xFF 0x00 0x00이 BREAK 또는 다른 패리티/프레이밍 오류를 나타낼 지 여전히 명확하지는 않지만).

참고 그러나 PARMRK을 사용하면 직렬 바이트를 삭제할 수있는 위험이 있음을 나타내는 this patch for PARMRK을 발견했습니다.

BREAK 조건이 지속되는 동안 또는 BREAK 조건의 시작 부분에만 한 번만 전송되는 경우에도 이러한 바이트가 계속 전송되는지는 명확하지 않습니다. 따라서이 방법을 통해 의 BREAK 상태를 감지 할 수 있는지 여부는 확실하지 않습니다.

+1

이것은입니다 조금 늦었지 만 같은 일에 궁금해하는 사람이 생길 경우 ... 휴식 시간이든 휴식 시간이든 수신 프레이밍 오류인지 여부는 하드웨어 수신자에게 모호합니다. 휴식의 전기적 의미는 매우 간단합니다. 선은 비정상적으로 오랫동안 낮게 유지됩니다. (IIRC, 주어진 보드 율에서 2+ 정상 바이트 전송을 충분히 설명 할 수있을만큼 길다. 오해 할 수 있습니다.) 단선 상태이기 때문에 휴식 시간을 알 수있는 좋은 방법이 없습니다. 휴식 일 뿐이라고 생각할만큼 오래 머물러있는 경우 휴식 일뿐입니다. – SirNickity

관련 문제