2017-01-11 2 views
0

시리얼 브레이크를 감지하고 어떤 시리얼 포트가 리눅스에서 그것을 생성했는지 알려줄 수 있습니까? 내가 휴식에서 sigint를 생성하는 몇 가지 솔루션을 봤어,하지만 난 2 직렬 포트 중 하나가 내가 sigints와 함께 할 수 없다는 것을 이해하는 휴식을 읽어야합니다.시리얼 브레이크 리눅스 감지

+0

* 프레이밍 오류 *에서 어떻게 sigint를 얻습니까? 나는 BREAK에 sigint를 생성하는'BRKINT' termios 입력 모드 플래그를 알고 있습니다. RS-232 BREAK는 일정 시간 이상, 일반적으로 한 문자 시간 동안 공간 레벨에서 회선을 유지함으로써 발생하는 특정 종류의 프레임 오류입니다. 따라서 프레이밍 오류가있는 제로 데이터 단어와 같습니다. 그러나 전체가 0이 아닌 데이터 단어의 프레이밍 오류는 BREAK가 아닙니다. 어떻게 그 신호를 얻습니까? – TrentP

+0

내 잘못, 당신은 프레이밍 오류에서 그것을 얻지 않지만 오히려 브레이크 (시작 비트가 없으므로 프레이밍 오류가 발생). 나는 – Pownyan

+0

IMO를 업데이트 할 것이다. 신호를 생성하기보다는 수신 된 데이터의 중단 조건 (예 : 3 데이터 바이트 '0xFF, 0x00, 0x00')을보고하도록 termios를 구성하는 것이 더 나을 것이다. 이 3 바이트 패턴을 메일의 어휘 검색에서 메시지 구분 기호로 사용하십시오. 즉, 정렬 된 완전한 메시지 패킷을 제공하기 위해 read() 시스템 호출을 사용하지 마십시오. – sawdust

답변

1

BRKINT은 직렬 포트가 포 그라운드 프로세스 그룹의 제어 tty 인 경우 신호를 보냅니다. 세션은 이하일 수 있습니다. tty를 제어합니다. 따라서 두 개 이상의 포트에서 신호를 수신 할 수 없으므로 신호의 출처를 알리는 것에 대해 걱정할 필요가 없다고 생각합니다.

termios은 모든 사람들이 직렬 텔레타이프 터미널을 사용하여 다중 사용자 메인 프레임에 연결된 시대의 고대 UNIX입니다. 소프트웨어 고고학. 직렬 UART 모니터링을위한 것이 아니기 때문에 직렬 포트에 대해 모르는 임의의 UNIX 명령이 누군가의 모뎀이 끊어지면 자동으로 종료 될 수 있습니다. vi은 편집중인 파일을 저장할 수 있습니다. vt102 터미널에서 'BREAK'키를 누르면 현재 명령이 종료됩니다.

이것을 사용하려면 두 개의 프로세스가 필요하며 각각 하나의 직렬 포트를 모니터링해야합니다. 어떤 포트가 신호를 받았는지에 따라 어느 포트가 중단되었는지 알 수 있습니다. 각 프로세스를 자체 세션 리더로 만들고 (setsid() 참조) 직렬 포트를 제어 tty로 설정해야합니다 (TIOCSCTTYTIOCSPGRP 참조).

또 다른 방법은 TIOCGICOUNT ioctl을 사용하여 직렬 포트를 연속적으로 폴링하는 것입니다. 이렇게하면 해당 포트의 중단, 프레임 및 패리티 오류 수에 대한 카운터가 제공됩니다. 그들이 증가 할 것을 지켜보십시오. 물론 폴링은 신호를받는 것보다 훨씬 효율적이지 않으므로 휴식을 발견하기 전에 폴링 간격까지 걸릴 수 있습니다.

응용 프로그램이 무엇인지 잘 모르겠지만, 문제가 될 수있는 재고가있는 Linux의 고대 및 불분명 RS-232 프로토콜에 대해 이야기하고있는 것으로 나타났습니다. BREAK를 위해 시리얼 라인 뱅크를 모니터링하거나, 패킷 간 프레이밍이나 8 비트 너비보다 큰 문자 등을 알리기 위해 글자 사이에 10 마이크로 초의 갭을 사용하는 것 등은 제대로 작동하지 않습니다. 커널 프로그래밍을 할 수 있다면 이러한 일을 가능하게하는 커스텀 라인 분야를 만들 수 있습니다. 포트의 사용자 공간에서 select() 번으로 전화하면 모니터링 된 이벤트가 발생할 때 신호를 보냅니다.이 중 하나는 휴식 (또는 프레이밍 오류 또는 패리티 오류) 일 수 있습니다.

+0

DMX512 (무대 조명 프로토콜)을 읽을 수 있기를 원하므로 기본적으로 새로운 데이터 집합을 시작하는 메시지로 오류를 처리하고 싶습니다. 한 가지 생각은 제게는 제동력/기타 오류로부터 실제로 신호를받는 대신 직렬 포트에서 읽기에 타임 아웃을 사용할 수 있다는 것입니다. 거기에 큰 위험이 있습니까? 적어도 데이터 세트 사이에 1ms가 있어야합니다. – Pownyan

+0

내가 고대 프로토콜과 관련있는 것처럼 들리는군요. 새로운 데이터 세트를 알리기 위해 BREAK를 생성 했습니까? 휴식은'공간 '수준에서> 1 문자입니다. RS-232는 '마크'레벨에서 유휴 상태입니다. 따라서 BREAK는 데이터 간의 유휴 기간이 아니며, 하나 이상의 문자 (대개 수십에서 수백 자)를 초과하는 거대한 시작 비트와 같습니다. – TrentP

+0

당신은 고대의 프로토콜에 대해 절대적으로 옳습니다 : P 나는 휴식을 일으킬 것이라고 확신합니다. 각 데이터 세트는 적어도 88us의 논리적 로우가 선행되기 때문에 데이터의 수 바이트를 쉽게 포함해야합니다. – Pownyan

관련 문제