3

我正在使用来自用户空间的 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上使用 poll 或 select 函数来检查文件描述符的变化,但我只能知道采集何时开始(通过检查 POLLIN 事件)。

4

2 回答 2

0

对谁可能有帮助,我最终在采集过程中使用缓冲文件的递归非阻塞读取来读取测量值。这样,当我读取了预期数量的样本时,程序可以安全地处理它们。

此外,似乎在系统可以继续执行另一个命令之前禁用缓冲类型等待采集完成:

     system("echo 0 > /sys/bus/iio/devices/iio:device0/buffer/enable");

第二种解决方案更像是一种轮询方法。

于 2016-12-22T16:15:54.497 回答
0

好吧,首先,这种方法无法扩展。如果将另一个 IIO 设备添加到您的系统并且设备 ID 发生更改怎么办?我建议使用libiio.

关于您的问题,即我怎么知道缓冲区何时已满?. 这可能取决于缓冲区大小和您使用的设备的特性。例如,ADC 转换器可能以不同于温度计的速率提供样本,更不用说更专业的设备了。

我没用过,不过里面有iio_buffer_get_poll_fd功能libiio。查看:http ://analogdevicesinc.github.io/libiio/group__Buffer.html 。

于 2018-08-06T11:12:09.793 回答