Linux에서 하드웨어 DTR / DSR 흐름 제어를 수행하는 방법 (직렬 포트 프로그래밍)?


4

RTS / CTS 핀 (tcsetattr의 경우 CRTSCTS 플래그)을 사용하여 하드웨어 흐름 제어를 사용하여 직렬 포트 통신을 설정할 수 있지만 안정적이고 효율적인 방법으로 DTR / DSR 핀을 흐름 제어에 사용할 방법이 없습니다.

TIOCMGET ioctl ()을 사용하여 핀 상태를 확인할 수 있지만 한 번에 한 바이트 씩 전송해야하므로 매우 느려집니다!

더 좋은 방법이 없을까요? 자체 케이블을 생산하는 것은 규모가 없으며 DTR / DSR 흐름 제어 만 사용하는 시장에 많은 POS 직렬 프린터가 있습니다.

추신 : XON / XOFF를 잊어 버리면 안정적인 8 비트 통신이 필요합니다.


더 나은 답변을 얻을 확률을 높이기 위해 내 대답을 삭제하도록 투표했습니다. 이것은 정말로 다른 사람들이 직면 한 흥미로운 문제인 것 같습니다. 흥미롭게도이 문제를 해결하기 위해 최소한 3 개의 커널 패치 (2001, 2008 및 2010)가 있었지만 현재 배포 커널에서는 구현되지 않은 것으로 보입니다. 사용자 정의 케이블 옵션을 사용하지 않는 경우에만 솔루션과 같이 보이는 것은 직접 커널을 패치하는 것입니다. 모든 설치 소프트웨어를 제어 할 수있는 POS 터미널의 경우 BSD UNIX도 사용해 볼 가치가 있습니다.
ktf

이 의견은 실제로 나를 도왔다. Red Hat Enterprise Linux 5.3에 2.6.18 커널에서이 문제를 해결하는 패치가 포함되어 있다는 것을 발견했습니다 [1]. RHEL은 꽤 많은 종류의 업계 표준이기 때문에 패치를 사용하는 것이 안전하다고 생각합니다. [2]. [1] rhn.redhat.com/errata/RHSA-2009-0225.html [2] bugzilla.redhat.com/show_bug.cgi?id=445211
nlucas

답변:


3

@ktf의 힌트 덕분에 내 자신의 질문에 답하기 위해 적어도 2.6.28 [1] 확장 된 속성을 설정하기위한 IOCTL (TCGETX, TCSETX, TCSETXF & TCSETXW)이 있음을 알게되었습니다.

그것들은 2008 년 10 월 13 일에 업스트림 커널에 추가 된 것 같습니다 [2].

이러한 여분의 IOCTL (SYS5와 호환 가능)은 개별적으로 처리하는 추가 핀 각각을 구성 할 수있게합니다.

원본 RHEL 패치 [3]에 대한 링크를보고 첨부 된 테스트 케이스에서 어떻게 사용하는지 예제를 살펴보십시오.

IOCTL 정의는 "asm-generic / ioctls.h"파일에 있고 구조체와 플래그 상수는 "linux / termios.h"( "/ usr / include"에 있음)에서 정의됩니다.

최신 정보

추가 연구에 따르면이 IOCTL에 대한 일반적인 직렬 지원이 업스트림 커널 소스에 병합되지 않았습니다. RHEL 5.3에는 있지만 업스트림 3.0.6 커널은 없습니다.
즉, ioctl () 호출은 RHEL 패치 [4]를 포팅하지 않은 다른 커널에서 실패합니다.

[1] http://lxr.free-electrons.com/ident?v=2.6.28;i=TCGETX
[2] https://lkml.org/lkml/2008/10/13/120
[삼] https://bugzilla.redhat.com/show_bug.cgi?id=445211
[4] https://bugzilla.redhat.com/attachment.cgi?id=315300&action=diff

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.