我使用用户空间的IIO驱动程序读取ADC (AD7924)的值。我有所有步骤让触发的获取正常工作(创建触发器、分配触发器、启用ADC通道、设置缓冲区的维度并启用它)。以下是此代码:
// Create IIO trigger
system("echo 0 > /sys/devices/iio_sysfs_trigger/add_trigger");
// Assign IIO trigger "sysfstrig0" to IIO AD7923 driver
system("echo sysfstrig0 > /sys/bus/iio/devices/iio:device0/trigger/current_trigger");
// Enable scan of the first 3 channels for AD7924
system("echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage0_en");
system("echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage1_en");
system("echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage2_en");
system("echo 0 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage3_en");
// Dim IIO buffer and enable it
sprintf(CommandeADC, "echo %d > /sys/bus/iio/devices/iio:device0/buffer/length", NB_ECH);
system(CommandeADC);
system("echo 1 > /sys/bus/iio/devices/iio:device0/buffer/enable");
//Launch acquisition...
system("echo 1 > /sys/bus/iio/devices/trigger0/trigger_now");这样配置的系统将处理获取,并填充完整的缓冲区。一旦它满了,收购就停止了。
我的问题是:我如何知道缓冲区什么时候满了?我尝试在位于/dev/中的文件iio:device0 0上使用轮询或select函数来检查文件描述符中的更改,但我只能知道收购何时开始(通过检查POLLIN )。
发布于 2016-12-22 16:15:54
对于那些可能有所帮助的人,我最终使用了缓冲区文件的递归非阻塞读取来读取获取过程中的措施。这样,当我阅读了预期的样本数,程序可以安全地处理它们。
此外,禁用缓冲区类等待获取以完成系统似乎可以执行另一个命令:
system("echo 0 > /sys/bus/iio/devices/iio:device0/buffer/enable");第二个解决方案更多的是一种轮询方法。
发布于 2018-08-06 11:12:09
好吧,首先,这样的方法是没有规模的。如果另一个IIO设备被添加到您的系统中,并且设备ID发生了更改,怎么办?我建议使用libiio。
关于您的问题,即,我如何知道缓冲区何时已完全填满?。这可能取决于您使用的缓冲区大小和设备的特性。例如,ADC转换器可能以比温度计更高的速率提供样品,更不用说更专业的设备了。
我从未使用过它,但是libiio中有libiio函数。退房:Buffer.html。
https://stackoverflow.com/questions/40590024
复制相似问题