FreeBSD 10.3 시스템의 직렬 포트에 있는 모뎀 제어 라인의 변경 사항에 반응하는 프로그램을 작성해야 합니다. 나는 그것에서 어떤 데이터도 읽고 싶지 않습니다(아무것도 없을 것입니다). 이런 일이 발생하면 IRQ4를 발생시키도록 포트를 구성할 수 있다는 것을 알고 있지만 내 프로그램은 어떻게 인터럽트를 수신합니까? 인터럽트 설명자 테이블에 함수 포인터를 설치해야 합니까? 필요한 경우 어떻게 설치하나요? 아니면 좀 더 간단하게 활용할 수 있는 것이 있나요?
담당자가 부족하기 때문에 여기에 plonk의 유용한 답변에 대해 언급할 수 없습니다.직렬 포트의 회선 상태 보기(모니터링)
얼마 전 밀링 머신의 디지털 판독을 수행할 때 MS-DOS의 병렬 포트와 비슷한 작업을 수행했지만 기억나는 한 그것은 리얼 모드에 있었고 IVT에 연결되어 있었습니다. 비교하면 간단합니다.
(참고: 작동하지만 통신 포트가 없는 간단한 UPS를 물려받았습니다. 기본적으로 서버 직렬 포트의 제어 라인을 전기적으로 분리/레벨 이동하여 패널 LED와 경고음을 "읽을" 수 있다고 생각했습니다. 기계에 관해서는 UPS가 평소와 다르게 종료 스크립트를 시작할 것이라는 것을 알고 있지만 상당히 빨리 설정할 수 있다면 새 기계 구입 시 £100를 절약할 수 있습니다.)
답변1
UPS이기 때문에 10초마다 모뎀 신호를 폴링할 여유가 있을 것 같습니다(freebsd에서).터미널(4)):
int state;
if(ioctl(fd, TIOCMGET, &state)...)
if(state & TIOCM_DTR)...
그러나 모뎀 신호(예: DCD) 변경에 대해 즉시 알림을 받으려면 tty 플래그를 Clear로 설정할 수 있습니다 CLOCAL
(참조:테미오스),
open()
모뎀 신호 DCD가 활성화될 때까지 포트가 정지됩니다. DCD를 분실하면 SIGHUP도 받게 됩니다.
또 다른 메커니즘은 라인 중 하나를 입력 RX 데이터 핀에 연결하는 것입니다. 이 값을 설정한 속도에 해당하는 문자 시간보다 높게 설정하면 프레임 오류가 발생합니다. IGNBRK=0 및 BRKINT=0이 설정된 경우 드라이버는 \0
입력 대기열에 널 바이트를 배치하여 read()
원시 모드인 경우 보류 중인 항목의 차단을 해제합니다.