시리얼 브레이크를 감지하고 어떤 시리얼 포트가 리눅스에서 그것을 생성했는지 알려줄 수 있습니까? 내가 휴식에서 sigint를 생성하는 몇 가지 솔루션을 봤어,하지만 난 2 직렬 포트 중 하나가 내가 sigints와 함께 할 수 없다는 것을 이해하는 휴식을 읽어야합니다.시리얼 브레이크 리눅스 감지
답변
BRKINT
은 직렬 포트가 포 그라운드 프로세스 그룹의 제어 tty 인 경우 신호를 보냅니다. 세션은 이하일 수 있습니다. tty를 제어합니다. 따라서 두 개 이상의 포트에서 신호를 수신 할 수 없으므로 신호의 출처를 알리는 것에 대해 걱정할 필요가 없다고 생각합니다.
이 termios
은 모든 사람들이 직렬 텔레타이프 터미널을 사용하여 다중 사용자 메인 프레임에 연결된 시대의 고대 UNIX입니다. 소프트웨어 고고학. 직렬 UART 모니터링을위한 것이 아니기 때문에 직렬 포트에 대해 모르는 임의의 UNIX 명령이 누군가의 모뎀이 끊어지면 자동으로 종료 될 수 있습니다. vi
은 편집중인 파일을 저장할 수 있습니다. vt102 터미널에서 'BREAK'키를 누르면 현재 명령이 종료됩니다.
이것을 사용하려면 두 개의 프로세스가 필요하며 각각 하나의 직렬 포트를 모니터링해야합니다. 어떤 포트가 신호를 받았는지에 따라 어느 포트가 중단되었는지 알 수 있습니다. 각 프로세스를 자체 세션 리더로 만들고 (setsid()
참조) 직렬 포트를 제어 tty로 설정해야합니다 (TIOCSCTTY
및 TIOCSPGRP
참조).
또 다른 방법은 TIOCGICOUNT
ioctl을 사용하여 직렬 포트를 연속적으로 폴링하는 것입니다. 이렇게하면 해당 포트의 중단, 프레임 및 패리티 오류 수에 대한 카운터가 제공됩니다. 그들이 증가 할 것을 지켜보십시오. 물론 폴링은 신호를받는 것보다 훨씬 효율적이지 않으므로 휴식을 발견하기 전에 폴링 간격까지 걸릴 수 있습니다.
응용 프로그램이 무엇인지 잘 모르겠지만, 문제가 될 수있는 재고가있는 Linux의 고대 및 불분명 RS-232 프로토콜에 대해 이야기하고있는 것으로 나타났습니다. BREAK를 위해 시리얼 라인 뱅크를 모니터링하거나, 패킷 간 프레이밍이나 8 비트 너비보다 큰 문자 등을 알리기 위해 글자 사이에 10 마이크로 초의 갭을 사용하는 것 등은 제대로 작동하지 않습니다. 커널 프로그래밍을 할 수 있다면 이러한 일을 가능하게하는 커스텀 라인 분야를 만들 수 있습니다. 포트의 사용자 공간에서 select()
번으로 전화하면 모니터링 된 이벤트가 발생할 때 신호를 보냅니다.이 중 하나는 휴식 (또는 프레이밍 오류 또는 패리티 오류) 일 수 있습니다.
DMX512 (무대 조명 프로토콜)을 읽을 수 있기를 원하므로 기본적으로 새로운 데이터 집합을 시작하는 메시지로 오류를 처리하고 싶습니다. 한 가지 생각은 제게는 제동력/기타 오류로부터 실제로 신호를받는 대신 직렬 포트에서 읽기에 타임 아웃을 사용할 수 있다는 것입니다. 거기에 큰 위험이 있습니까? 적어도 데이터 세트 사이에 1ms가 있어야합니다. – Pownyan
내가 고대 프로토콜과 관련있는 것처럼 들리는군요. 새로운 데이터 세트를 알리기 위해 BREAK를 생성 했습니까? 휴식은'공간 '수준에서> 1 문자입니다. RS-232는 '마크'레벨에서 유휴 상태입니다. 따라서 BREAK는 데이터 간의 유휴 기간이 아니며, 하나 이상의 문자 (대개 수십에서 수백 자)를 초과하는 거대한 시작 비트와 같습니다. – TrentP
당신은 고대의 프로토콜에 대해 절대적으로 옳습니다 : P 나는 휴식을 일으킬 것이라고 확신합니다. 각 데이터 세트는 적어도 88us의 논리적 로우가 선행되기 때문에 데이터의 수 바이트를 쉽게 포함해야합니다. – Pownyan
- 1. 리눅스 비표준 시리얼 콘솔
- 2. 리눅스 - RS485와의 시리얼 통신
- 3. 리눅스 커널 하드웨어 브레이크 포인트
- 4. 브레이크 아웃 게임 - 충돌 감지
- 5. 리눅스 시리얼 콘솔을 imx31에서 작동시키기
- 6. 시리얼 넘는 리눅스 명령 보내기
- 7. 리눅스 바이너리 시리얼 읽기 문제
- 8. 브레이크 아웃 게임, 직사각형 충돌 감지
- 9. 리눅스 - 게으름 감지
- 10. Arduino UNO와 ESP8266 HUZZAH 브레이크 아웃 소프트웨어 시리얼
- 11. 리눅스 블로킹에서 시리얼 쓰기, 타임 아웃을위한 해결책?
- 12. 리눅스 커널 모듈에서 시리얼 포트에 접근하기
- 13. 리눅스 커맨드 라인에 시리얼 메일을 만드십시오.
- 14. 리눅스에서 시리얼 포트에 문제가있다. avr과 리눅스 사이
- 15. 시트릭스 리시버 (13) + 리눅스 : 시리얼 포트 리디렉션
- 16. jQuery를이 - 일반 플랫폼 감지 윈도우/리눅스/애플
- 17. HDMI 케이블이 꽂혀있을 때 감지 데스크탑 리눅스
- 18. 리눅스 env에 대한 파이썬의 USB 자동 감지
- 19. pid는 우리가 감지 할 수있는 리눅스
- 20. 2 대의 리눅스 PC 사이의 시리얼 연결을 확인하는 방법
- 21. C에서 우분투 리눅스 (11.10)의 시리얼 포트에서 읽기
- 22. arduino와 시리얼 통신을하기 위해 리눅스 커널 모듈을 작성하는 방법은 무엇입니까?
- 23. 시리얼
- 24. 리눅스
- 25. 이맥스에있는 시리얼 터미널
- 26. 안드로이드는, 지정된 String 및 브레이크 라인
- 27. 리눅스에서의 소프트웨어 시리얼 포트 루프백
- 28. GDB, 브레이크 상태는, 내가 브레이크 포인트를 설정하려는 NULL 포인터
- 29. 재생 브레이크 소리 soundpool
- 30. 브레이크 루프/자바 스크립트
* 프레이밍 오류 *에서 어떻게 sigint를 얻습니까? 나는 BREAK에 sigint를 생성하는'BRKINT' termios 입력 모드 플래그를 알고 있습니다. RS-232 BREAK는 일정 시간 이상, 일반적으로 한 문자 시간 동안 공간 레벨에서 회선을 유지함으로써 발생하는 특정 종류의 프레임 오류입니다. 따라서 프레이밍 오류가있는 제로 데이터 단어와 같습니다. 그러나 전체가 0이 아닌 데이터 단어의 프레이밍 오류는 BREAK가 아닙니다. 어떻게 그 신호를 얻습니까? – TrentP
내 잘못, 당신은 프레이밍 오류에서 그것을 얻지 않지만 오히려 브레이크 (시작 비트가 없으므로 프레이밍 오류가 발생). 나는 – Pownyan
IMO를 업데이트 할 것이다. 신호를 생성하기보다는 수신 된 데이터의 중단 조건 (예 : 3 데이터 바이트 '0xFF, 0x00, 0x00')을보고하도록 termios를 구성하는 것이 더 나을 것이다. 이 3 바이트 패턴을 메일의 어휘 검색에서 메시지 구분 기호로 사용하십시오. 즉, 정렬 된 완전한 메시지 패킷을 제공하기 위해 read() 시스템 호출을 사용하지 마십시오. – sawdust