01、工业I/O简介
一、IIO子系统的特点
① 支持的设备类型
IIO可以连接多种设备,包括:
- 传感器:如温度计、湿度计、加速度计(测加速的)、陀螺仪(测旋转的)等。
- 数据转换设备:例如将模拟信号转数字信号的ADC,或相反的DAC(数字转模拟)。
- 其他输入/输出设备:比如测光的传感器、测压力的传感器等。
② 数据传输方式
IIO采用“事件驱动”模式处理数据:
- 设备在数据准备好后主动通知系统,而不是让系统一直询问“有没有数据”。
- 这种方式能节省资源,避免不必要的等待或重复检查。
③ 统一的操作方式
IIO提供统一的使用接口:
- 不同设备(比如温度计和压力传感器)可以通过同一套操作方法来控制。
- 开发者只需写一次代码,就能让程序兼容多种设备,省去重复开发的麻烦。
④ 灵活的数据处理
IIO支持多种数据格式:
- 能根据设备需求自动调整数据格式,方便用户直接使用或进一步处理数据。
:::
总结
IIO就像一个“通用翻译器”,让不同设备用统一的语言与程序沟通,同时高效传输数据,减少资源浪费。 :::
二、IIO的架构
IIO子系统分为两大部分:
一、内核层(系统底层)
- 硬件驱动模块:直接和硬件设备打交道,负责启动设备、读取数据、调整设置等基础工作。
- 核心管理模块:像"总指挥"一样统筹管理所有设备,负责设备注册、状态查询和数据传输等核心功能。
- 事件通知模块:当设备有新数据时,会主动向应用程序发送提醒,类似于"数据已准备好"的通知功能。
二、用户空间(应用层) 系统在软件层提供了简单易用的访问接口,应用程序可以通过以下方式使用设备:
- 像操作普通文件一样读写设备数据(例如用cat命令读取传感器数值)
- 通过标准文件系统路径配置设备参数(例如调整采样频率)
- 能够接收设备触发的数据就绪通知,方便实时数据处理
整个设计让用户程序无需关心底层复杂细节,就能方便地使用各类传感器和测量设备。
三、IIO设备的使用
- 以下是更直白的改写版本:
设备文件
Linux系统中的IIO设备通常以/dev/iio:deviceX
的形式存在(比如/dev/iio:device0
)。用户只需要像打开普通文件一样打开这些设备文件,就能与硬件交互。读取数据
读取数据就像读取普通文件一样简单。例如,可以用read()
函数直接从设备文件中读取传感器的测量结果(如温度、加速度等数据)。设置设备参数
要调整设备的参数(如采样率、测量范围等),可以通过两种方式:- 方法一:使用
ioctl
命令(类似向设备发送指令的系统功能)。 - 方法二:直接向设备文件写入配置信息(例如用
echo
命令写入参数)。
不同设备的具体设置方法和参数需要参考对应设备的官方文档。
- 方法一:使用
:::
总结:
打开设备:像打开文件一样操作 /dev/iio:deviceX
。
获取数据:用文件读取函数(如 read()
)直接读取数据。
修改设置:通过 ioctl
命令或写入文件配置参数(需查阅设备手册)。 :::
示例代码
以下是一个简单的示例,展示如何在用户空间读取IIO设备的数据:
C++
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd;
char buffer[64];
// 打开IIO设备
fd = open("/dev/iio:device0", O_RDONLY);
if (fd < 0) {
perror("Failed to open IIO device");
return -1;
}
// 读取数据
ssize_t bytesRead = read(fd, buffer, sizeof(buffer) - 1);
if (bytesRead < 0) {
perror("Failed to read from IIO device");
close(fd);
return -1;
}
// 处理和输出数据
buffer[bytesRead] = '\0'; // 确保字符串结束
printf("Sensor data: %s\n", buffer);
// 关闭设备
close(fd);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
四、IIO节点介绍
IIO芯片是连接物理传感器或转换器的硬件接口,它通过两种方式与用户程序交互:
- 系统文件目录
在/sys/bus/iio/iio:deviceX路径下,会为每个传感器生成一个专属文件夹。这里存放着传感器的基本信息和所有数据通道的控制文件,每个传感器通道都对应一个单独的配置文件。 - 设备文件接口
在/dev目录下对应的iio:deviceX设备文件,可以像操作普通文件一样读写。这个接口主要用于实时获取传感器事件数据,以及实现数据流的批量读取(当设备支持缓冲功能时)。
简单来说:系统文件目录用于配置和查询传感器状态,设备文件则用于直接读取传感器数据流。
五、IIO头文件
IIO API分布在几个头文件中,如下所示:
C++
#include <linux/iio/iio.h> /* 强制性的 */
#include <linux/iio/sysfs.h> /* 因为使用了sysfs,所以是强制性的 */
#include <linux/iio/events.h> /* 对于高级用户,管理IIO事件 */
#include <linux/iio/buffer.h> /* 强制使用触发缓冲区 */
#include <linux/iio/trigger.h>/* 仅当在驱动程序中实现触发器(很少使用)时*/
1
2
3
4
5
2
3
4
5