我正在使用帶有iio驅動程序的名爲LSM6DSL的IMU傳感器。它們工作得很好,如果我用命令顯示原始值:IIO設備緩衝區始終爲空
cat /sys/bus/iio/devices/iio:device0/in_accel_x_raw
於是我決定用libiio這樣我就可以讀取一個C程序中的所有這些值:
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
我錯過了什麼嗎?讓我知道你是否需要更多信息。
很難說這是什麼原因。可以是任何權限問題(嘗試使用root?)到庫錯誤。你應該調試你的程序+ libiio(使用'gdb','strace'或者只是添加'printf' trace)。只需在調用'iio_device_create_buffer()'之前放置一箇中斷點並下臺,直到找到確切發生'-EBUSY'錯誤的地方。您可能需要使用[debug symbols](https://wiki.debian.org/DebugPackage)來調試libiio。如果您需要我們的幫助 - 請在此處提供更新,並提供確切的代碼行,其中'-EBUSY'在libiio中設置。 –
另外,用'EBUSY'單詞來清理libiio的源碼是個不錯的主意。假設這個錯誤是由libiio函數返回的,而不是由syscall/libc函數返回的,比如'open()'或'fopen()',你可能會知道發生了什麼。 –
@SamProtsenko,順便說一句,有一個技巧,你可以用它來找到罪魁禍首,即'#undef EINVAL; #define EINVAL __LINE__'。也許我必須寫一篇關於它的文章:-) – 0andriy