Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C IIO设备缓冲区始终为空_C_Linux Kernel_Accelerometer_Gyroscope_Iio - Fatal编程技术网

C IIO设备缓冲区始终为空

C IIO设备缓冲区始终为空,c,linux-kernel,accelerometer,gyroscope,iio,C,Linux Kernel,Accelerometer,Gyroscope,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

我正在使用一个名为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

我错过什么了吗?如果您需要更多信息,请告诉我。

我想我找到了答案,但我没有注意ncurses库的效果(很抱歉没有提到我正在使用它)


我在初始化ncurses之前移动了这些函数,现在缓冲区创建成功。

很难说原因是什么。可以是权限问题(尝试使用root?)到库错误。您应该调试您的程序+libiio(使用
gdb
strace
或只添加
printf
跟踪)。在调用
iio\u设备\u create\u buffer()
之前,只需输入一个断点,然后往下走,直到找到
-EBUSY
错误发生的确切位置。您可能需要使用来调试libiio。如果您需要我们的帮助,请在此处抛出一个更新,提到libiio中设置了
-EBUSY
的确切代码行。此外,通过
EBUSY
word对libiio的源代码进行grepping也是一个好主意。假设这个错误是由libiio函数返回的,而不是由syscall/libc函数返回的,比如
open()
fopen()
,您可能会对发生的情况有一个很好的了解。@SamProtsenko,顺便说一句,有一个技巧可以用来找到罪魁祸首行,即
#undef EINVAL#定义EINVAL\uuuu行\uuuu
。也许我必须写一篇关于它的文章:-)@0andriy Neat hack:)但在这种情况下,你必须重建libiio来利用这个技巧。而且仍然有可能
-EBUSY
来自某个系统调用或libc调用。所以我倾向于在这里使用旧的良好调试。@0andriy说到调试技术,我发现最有用的是我称之为“智能grep”的技术。这意味着:1)使用
grep
/
cscope
/无论什么方法,查找代码中可能导致问题的所有位置。2) 使用您的知识和逻辑进一步缩小可能的原因,这通常会立即给出答案,从而消除实际调试的需要。3) 如果您仍然有几个可能的原因——一些
printk
/
printf
跟踪通常足以快速找出实际原因。这种方法的唯一问题是强迫自己更频繁地使用它:)好的是你找到了问题的根本原因。继续接受你的答案。嗨,Stackoverflow说我能在20小时内完成!