저는 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()
이는 확실히 약간의 복잡성을 추가하지만 커널 드라이버를 구하거나 하드웨어를 재설계하는 것보다는 여전히 쉽다고 생각합니다.
편집하다
이것타이핑이 계속됩니다동일한 기술을 사용하여 다양한 문제를 해결하십시오.