두 개의 독립적인 단방향(단방향) 직렬 포트를 사용하여 단일 tty 장치를 만드는 것이 가능합니까?

두 개의 독립적인 단방향(단방향) 직렬 포트를 사용하여 단일 tty 장치를 만드는 것이 가능합니까?

저는 PC와의 IR 통신을 위한 임베디드 장치를 구축 중입니다. 여기에는 두 개의 단방향 IR Led/감지기 쌍이 있으며 다음과 같이 설정됩니다. IR 소스 입력 명령 -> 명령을 수신하기 위해 임베디드 장치 근처에 위치한 감지기, 임베디드 근처에 있는 IR 소스 모니터링 출력용 -> 모니터링 데이터를 얻기 위한 외부 장치용 출력 근처의 감지기.

하드웨어에서 이를 구현하는 가장 쉬운 방법은 각 IR/감지기 쌍에 대해 별도의 단방향 직렬 통신 포트를 갖는 것입니다. 첫 번째는 명령 전송용이고 두 번째는 출력 모니터링용입니다.

/dev/ttyUSB1내 Linux PC의 경우에는 및 로 나열된 두 개의 별도 직렬 포트가 있습니다 /dev/ttyUSB2. 내가 원하는 것은 하나의 ttyUSB를 입력으로 사용하고 다른 하나를 출력으로 사용하면서 터미널을 통해 단일 양방향 포트로 두 포트 모두에 액세스할 수 있는 것입니다.

가상 장치 솔루션이면 /dev/충분하지만 꼭 필요한 것은 아닙니다. minicom(또는 그 대체품)과 같은 프로그램이 두 개의 독립 포트에서 반응하도록 하면 새로운 가상 장치가 필요하지 않습니다.

문제는 PC 측에서만 발생하며 소프트웨어에서 수정되어야 한다고 생각합니다. 이 문제에 대한 해결책이 없다면 일부 사용자 정의 하드웨어 다중화/버퍼링을 추가하여 이 두 포트에서 단일 통신 포트를 생성할 수도 있습니다.

편집: 내 문제가 어디에 있는지 더 잘 설명하기 위해 (다소 대략적인 초안) 이미지를 추가했습니다. 여기에 이미지 설명을 입력하세요.

답변1

나는 minicom이 하는 호출을 무시하기 위해 동적 라이브러리( LD_PRELOAD당신이 그것을 만들어야 함)를 사용할 것입니다. open()나는 그것에 더 많은 것이 있다고 생각하지 않습니다.read()write()ioctl()close()

Google의 "ld_preload 재정의"를 사용하면 이 기술에 대한 많은 예를 찾을 수 있습니다.

  • minicom 명령을 사용하여 strace호출 내용을 확인하세요.
  • open()라이브러리 재정의를 시작하세요.
  • 존재하지 않는 tty 장치 이름을 정의하십시오. 예:/dev/mytty
  • 그런 다음 이 tty를 통해 minicom을 실행하십시오.
  • 구현 open()에서 이 장치 이름과 일치하십시오.
    • 일치하면 실제 ttyUSB 쌍을 열어야 합니다.
    • fallback이 true로 일치하지 않는 경우open()

open()이 라이브러리는 minicom이 호출하는 모든 라이브러리를 대체하므로 파일 이름이 일치하지 않는 경우~ 해야 하다실제 값으로 대체합니다( open()재정의하는 모든 호출뿐만 아니라).

tty 쌍이 성공적으로 열리면 유효한 파일 설명자가 반환되고, 그렇지 않으면 오류가 반환됩니다.
라이브러리에서 이 파일 설명자를 사용하여 더 많은 정보(예: 실제 tty의 두 파일 설명자)를 연결하려고 합니다.

다른 호출의 경우 일치해야 하는 것은 파일 설명자입니다. open에서 반환된 파일 설명자와 일치하면 호출은 ttyUSB1에 /dev/mytty있는 경우 real을 호출하고 ttyUSB2에 있는 경우 real을 호출 write()하려는 것입니다 . 설명자가 실제 호출과 일치하지 않으면 실제 호출로 대체됩니다.write()read()read()

ioctl 매개변수에 따라 일부 ioctl은 읽기 장치로, 일부는 쓰기 장치로, 일부 ioctl()는 둘 다로 이동해야 할 수도 있습니다.

편집하다

select()아마도 minicom과 같이 잘 만들어진 터미널은 비차단 접근 방식을 사용하므로 or 와 같은 호출을 래핑해야 하며 poll()이는 확실히 약간의 복잡성을 추가하지만 커널 드라이버를 구하거나 하드웨어를 재설계하는 것보다는 여전히 쉽다고 생각합니다.

편집하다

이것타이핑이 계속됩니다동일한 기술을 사용하여 다양한 문제를 해결하십시오.

관련 정보