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
내가 누락 된 항목이 있습니까? 더 많은 정보가 필요한 경우 알려주십시오.
이유가 무엇인지 말하기는 어렵습니다. 사용 권한 문제 (루트를 사용하여 시도 하시겠습니까?)에서 라이브러리 버그에 이르기까지 수 있습니다. 당신은 프로그램 + libiio ('gdb','strace' 또는'printf' 추적을 사용하여)를 디버깅해야합니다. 'iio_device_create_buffer()'를 호출하기 전에 중단 점을 넣고 정확히 '-EBUSY' 오류가 발생할 때까지 단계를 밟습니다. libiio를 디버깅하려면 [debug symbols] (https://wiki.debian.org/DebugPackage)을 사용해야 할 수도 있습니다. 거기에서 우리의 도움이 필요하다면 libiio에'-EBUSY'가 설정되어있는 정확한 코드 행을 언급하면서 여기에 업데이트를 던지십시오. –
또한 libiio의 소스를'EBUSY' 단어로 grepping하는 것이 좋습니다. 이 오류는'open()'이나'fopen()'과 같은 syscall/libc 함수가 아닌 libiio 함수에 의해 리턴되었다고 가정하면, 당신은 꽤 잘 할 수 있습니다. –
@SamProtsenko, btw, 범인을 찾기 위해 사용할 수있는 속임수가 있습니다. 즉,'#undef EINVAL; #define EINVAL __LINE__'. 아마도 내가 그것에 대해 기사를 써야만합니다 :-) – 0andriy