
나는 무선 송신기-수신기(NRF24L01)를 사용하여 마치 직렬 인터페이스를 통해 연결된 것처럼 두 장치를 연결하려는 의도로 일련의 프로그램을 작성했습니다.
현재 장치 A에서 B로 bash 명령을 한 방향으로 보낼 수 있습니다. 내 A 장치는 현재 AVR 마이크로 컨트롤러입니다.
내 B 장치는 Rapberry Pi입니다. 다음 명령을 사용하여 수신된 텍스트를 bash로 파이프합니다. 이를 통해 명령을 보낼 수 있지만 해당 출력을 A 장치로 다시 보낼 수는 없습니다.
./program | bash
프로그램이 수신된 데이터에 반응하는 것을 차단하거나 방지하지 않는 방식으로 bash의 출력을 내 프로그램으로 다시 파이프하는 방법을 잘 모르겠습니다. 양방향으로 파이프를 설치하는 것이 가능하다면 fgets
막는다는 기능은 아직 사용할 수 없을 것 같습니다 .
두 장치 모두 전송 및 수신 기능에 대해 동일한 라이브러리를 공유하며, 이러한 전송 및 수신 기능은 비차단으로 만드는 옵션을 사용하여 호출할 수 있습니다.
답변1
가장 쉬운 접근 방식은 아마도 프로그램을 사용하는 것입니다.pipe2
세 번 반복하여 세 개의 파이프(stdin, stdout 및 stderr 각각에 대해)를 만듭니다. 아마도 비차단 모드를 원할 것입니다. 그런 다음 포크를 사용하여 아이에게 사용하게 하세요.dup2
파이프를 파일 설명자 0, 1, 2에 넣습니다. 그런 다음 자식은 다음 중 하나를 사용합니다.임원 가족달리다 bash
.
그런 다음 부모는 다음을 사용할 수 있습니다.select
읽을 데이터가 있는지 또는 쓸 공간이 있는지 확인합니다.
활용할 수 있는 라이브러리나 기존 구현이 있을 수 있습니다.
참고 #1: pipe2
두 개의 파일 설명자를 반환합니다. 하나는 파이프의 읽기 측용이고 다른 하나는 쓰기 측용입니다. 예를 들어, bash의 stdin의 경우 bash에는 읽기 측(입력 읽기)이 필요하고 프로그램에는 쓰기 측(bash의 입력 쓰기)이 필요합니다. bash의 stdout은 그 반대입니다. bash에는 쓰기 측이 필요하고 프로그램에는 읽기 측이 필요합니다.
참고 #2: 이는 완전한 터미널 경험을 제공하지 않습니다. 그러기 위해서는 ptys를 처리해야 하는데, 이로 인해 복잡성이 추가됩니다(솔직히 찾아보아야 합니다). 원한다면 비슷한 프로그램을 찾아 시작하는 것이 좋습니다.