2017-05-16 4 views
3

내장 시스템에서 USB 직렬 장치를 연결하거나 분리 할 때 감지해야하며 tty이 무엇인지 알고 있어야합니다.C++ USB 직렬 장치 감지 연결/연결 해제

내 시스템은 2.6 Linux 커널에서 실행됩니다.

udev 규칙에 대한 쓰기 권한이 없으므로 요즘 파일 시스템에서이 정보를 얻으려는 시도가있어 /sys/bus/usb/devices 디렉토리의 수정 사항을 찾고 있습니다. 그러나, 나는이 접근 방식에 몇 가지 문제점에 직면 해있다.

USB 포트 (예 : 1-1.3)의 Id BUS은 무엇이 연결되어 있는지 알고 있습니다. 따라서 연결된 tty (디렉토리는 /sys/bus/usb/devices/<Id BUS>:1.0/tty/ - 예 : /sys/bus/usb/devices/1-1.3:1.0/tty/ttyACM0)을 검색합니다. 이렇게하면 /dev/ttyACM0을 사용하여 내 장치와 통신해야한다는 것을 알고 있습니다. 하지만 때로는이 장치 (/dev/ttyACM0)가 존재하지 않습니다.

이 정보를 얻을 수있는 더 좋은 방법이 있습니까?

나는 심지어 syslog에서이 정보를 얻으려는 것으로 생각했지만, 이것이 꽤 좋은지는 모르겠다.

편집 :

만 내 시스템이 새로운 장치가 연결되어있는 경우 감지 (과 연결된 tty 이름을 얻는) 즉, USB 버스의 상태 변화를 감지 할 수 있어야하거나 기존, 명확히하기 하나는 뽑혔다.

시스템은 USB 허브를 사용하여 연결되는 USB/직렬 장치를 최대로 N 개까지 모니터링합니다. 정상적인 실행 중에는 새 장치를 연결할 수 있으며 기존 장치를 제거 할 수 있습니다 (또는이 범위 밖의 원격 명령으로 재부팅 할 수 있음). 기기가 재부팅 될 때 이전에 사용 된 것과 다른 tty (예 : ttyACM0 ->ttyACM3)이 수신 될 수 있습니다. 이는 커널이 현재 무료 인 tty을 지정했기 때문에 큰 문제입니다.

답변

0

libusbp이라는 USB 추상화 라이브러리를 작성했습니다. port_name example을보고 libusbp를 사용하여 USB 직렬 장치에 직렬 포트 이름 (예 : /dev/ttyACM0)을 얻는 방법을 보여줍니다. 뒤에서 libusbp는 libudev를 사용하여이 정보를 얻습니다.

+0

감사합니다. @ david-grayson, 나는 문제가되는 시나리오에 대한 더 나은 개요를 추가하여 질문을 편집했습니다. lib를 사용하여 설명 된 요구 사항을 충족시킬 수 있습니까? – Valmir

+0

예, 정상적으로 작동합니다. –

+0

임베디드 시스템에는 libudev가 없으므로 mdev 만 있으므로 lib를 사용할 수 없습니다. – Valmir

0

stat를 사용하여 가상 파일이 삭제되었는지 확인하십시오.

#include <sys/statvfs.h> 

... 

struct stat sb; 
return (stat("/dev/ttyUSB0", &sb) == 0); // true if open, false otherwise