2017-05-18 19 views
1

iio 드라이버와 함께 LSM6DSL이라는 IMU 센서를 사용하고 있습니다.IIO 장치 버퍼 항상 null

cat /sys/bus/iio/devices/iio:device0/in_accel_x_raw 

그럼 내가 C 프로그램에서 모든 값을 읽을 수 있도록 libiio를 사용하기로 결정 : 나는 명령을 사용하여 원시 값을 표시 한 경우에는 잘 작동

struct iio_context *context = iio_create_local_context(); 
struct iio_device *device = iio_context_get_device(context, 1); 
struct iio_channel *chan = iio_device_get_channel(device, 0); 
iio_channel_enable(chan); 
if (iio_channel_is_scan_element(chan) == true) 
    printf("OK\n"); 
struct iio_channel *chan2 = iio_device_get_channel(device, 1); 
iio_channel_enable(chan2); 
struct iio_buffer *buff = iio_device_create_buffer(device, 1, true); 
if (buff == NULL) 
{ 
    printf("Error: %s\n", strerror(errno)); 
    return (1); 
} 

을 그리고 이것은이다 결과 :

OK 
Error: Device or resource busy 

내가 누락 된 항목이 있습니까? 더 많은 정보가 필요한 경우 알려주십시오.

+1

이유가 무엇인지 말하기는 어렵습니다. 사용 권한 문제 (루트를 사용하여 시도 하시겠습니까?)에서 라이브러리 버그에 이르기까지 수 있습니다. 당신은 프로그램 + libiio ('gdb','strace' 또는'printf' 추적을 사용하여)를 디버깅해야합니다. 'iio_device_create_buffer()'를 호출하기 전에 중단 점을 넣고 정확히 '-EBUSY' 오류가 발생할 때까지 단계를 밟습니다. libiio를 디버깅하려면 [debug symbols] (https://wiki.debian.org/DebugPackage)을 사용해야 할 수도 있습니다. 거기에서 우리의 도움이 필요하다면 libiio에'-EBUSY'가 설정되어있는 정확한 코드 행을 언급하면서 여기에 업데이트를 던지십시오. –

+0

또한 libiio의 소스를'EBUSY' 단어로 grepping하는 것이 좋습니다. 이 오류는'open()'이나'fopen()'과 같은 syscall/libc 함수가 아닌 libiio 함수에 의해 리턴되었다고 가정하면, 당신은 꽤 잘 할 수 있습니다. –

+1

@SamProtsenko, btw, 범인을 찾기 위해 사용할 수있는 속임수가 있습니다. 즉,'#undef EINVAL; #define EINVAL __LINE__'. 아마도 내가 그것에 대해 기사를 써야만합니다 :-) – 0andriy

답변

1

내가 대답을 찾은 것 같아요. 그리고 ncurses 라이브러리 (사용하고 있다고 언급하지 않아서 미안합니다)의 영향에주의를 기울이지 않았습니다.

ncurses를 초기화하기 전에이 기능을 이동 했으므로 버퍼가 성공적으로 만들어졌습니다.

+0

좋은 점은 문제의 근본 원인을 발견 한 것입니다. 가서 대답을 수락하십시오. –

+0

안녕하세요, Stackoverflow는 20 시간 내에 그렇게 할 수 있다고 말합니다! – ynitsed