Linux의 직렬 포트에서 BREAK 상태를 감지하고 싶습니다. 어떻게 이뤄지나요?Linux 직렬 포트에서 BREAK 상태 수신/읽기
BREAK 조건이 종료되면 및이 시작될 때이를 감지하고 싶습니다.
int serial_status;
ioctl(serial_fd, TIOCMGET, &serial_status);
다음 브레이크 보여주는 비트 값이 될 조건을-하지만 그런 일이 없다 보인다
은 내가 그랬다면 기대.
나는 휴식을 보내는 에 대한 termios.h
에 tcsendbreak()
을 발견했다. 나 또한 휴식을 보내는 방법을 설명하는 tty_ioctl
man page을 발견했습니다. 그러나 휴식을 취하는 것은 어떨까요?
참고 :BRKINT
이 제안되었습니다 (중단이 발생할 때 SIGINT
신호를 생성 함).
- 나는 그것이 여러 직렬 포트 시나리오에서 오는 직렬 어떤 포트 말할 수 없다 : 그러나
SIGINT
을 얻는 것은 몇 가지 이유에 대한 이러한 유용한 API는 없습니다. - 사용자가 터미널에서 프로그램을 실행할 때 Ctrl-C를 눌러
SIGINT
을 얻을 수도 있습니다. - 프로그램을 데몬으로 실행하는 경우 "터미널이 포 그라운드 프로세스 그룹의 제어 터미널 인 경우"는 사실이 아닙니다.
- BREAK 상태가 지속되는 기간과 중단되는시기를 알 수 없습니다.
링크하려는'termios' 맨 페이지에서'BRKINT'를보세요. –
@AntonKovalenko : 제 질문에 'BRIGINT'(SIGINT 생성)가 유용하지 않다고 말하는 메모를 추가했습니다. –
비정상적인 수신 조건 (예 : 패리티 오류, 프레이밍 오류, 오버런 또는 중단)이 발생할 때 수신 버퍼에 일반적으로 채워지는 플래그 인 '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