2017-05-18 126 views
1

我正在使用帶有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 

我錯過了什麼嗎?讓我知道你是否需要更多信息。

+1

很難說這是什麼原因。可以是任何權限問題(嘗試使用root?)到庫錯誤。你應該調試你的程序+ libiio(使用'gdb','strace'或者只是添加'printf' trace)。只需在調用'iio_device_create_buffer()'之前放置一箇中斷點並下臺,直到找到確切發生'-EBUSY'錯誤的地方。您可能需要使用[debug symbols](https://wiki.debian.org/DebugPackage)來調試libiio。如果您需要我們的幫助 - 請在此處提供更新,並提供確切的代碼行,其中'-EBUSY'在libiio中設置。 –

+0

另外,用'EBUSY'單詞來清理libiio的源碼是個不錯的主意。假設這個錯誤是由libiio函數返回的,而不是由syscall/libc函數返回的,比如'open()'或'fopen()',你可能會知道發生了什麼。 –

+1

@SamProtsenko,順便說一句,有一個技巧,你可以用它來找到罪魁禍首,即'#undef EINVAL; #define EINVAL __LINE__'。也許我必須寫一篇關於它的文章:-) – 0andriy

回答

1

我想我找到了答案,我沒有注意到ncurses庫的影響(遺憾的是不提及我正在使用它)。

我在ncurses初始化之前移動了這些函數,現在緩衝區創建成功了。

+0

好事是你找到了問題的根源。繼續並接受你的回答。 –

+0

嗨,Stackoverflow說,我將能夠在20小時內這樣做! – ynitsed