Q群:
电话:
邮箱:
地址:
接口 | 说明 |
---|---|
os_device_find() | 根据传感器设备名称查找设备 |
os_device_open() | 打开传感器设备 |
os_device_read() | 读取数据 |
os_device_control() | 控制传感器设备 |
os_device_close() | 关闭传感器设备 |
该函数根据传感器设备名称查找设备,函数原型如下:
os_device_t *os_device_find(const char* name);
参数 | 说明 |
---|---|
name | 传感器设备名称 |
返回 | 说明 |
设备指针 | 查找到对应设备将返回相应的设备指针 |
OS_NULL | 没有找到相应的设备对象 |
该函数用于打开设备,函数原型如下:
os_err_t os_device_open(os_device_t *dev, os_uint16_t oflag);
参数 | 说明 |
---|---|
dev | 设备指针 |
oflag | 设备模式标志 |
返回 | 说明 |
OS_EOK | 设备打开成功 |
OS_EBUSY | 设备忙 |
其他错误码 | 设备打开失败 |
该函数用于读取传感器接收到的数据,函数原型如下:
os_size_t os_device_read(os_device_t *dev, os_off_t pos, void* buffer, os_size_t size);
参数 | 说明 |
---|---|
dev | 设备指针 |
pos | 读取数据偏移量,此参数传感器未使用 |
buffer | 缓冲区指针,读取的数据将会被保存在缓冲区中 |
size | 读取数据的大小 |
返回 | 说明 |
读到数据的实际大小 | 返回读取到数据的个数 |
0 | 需要读取当前线程的 errno 来判断错误状态 |
该函数用于对传感器设备进行配置,函数原型如下:
os_err_t os_device_control(os_device_t *dev, int cmd, void* arg);
参数 | 说明 |
---|---|
dev | 设备指针 |
cmd | 命令控制字 |
arg | 控制的参数 |
返回 | 说明 |
OS_EOK | 函数执行成功 |
OS_ENOSYS | 执行失败,dev 为空 |
其他错误码 | 执行失败 |
其中的 cmd 目前支持以下几种命令控制字:
#define OS_SENSOR_CTRL_GET_ID (0) /* Get device id */
#define OS_SENSOR_CTRL_GET_INFO (1) /* Get sensor info */
#define OS_SENSOR_CTRL_SET_RANGE (2) /* Set the measure range of sensor */
#define OS_SENSOR_CTRL_SET_ODR (3) /* Set output date rate. unit is HZ */
#define OS_SENSOR_CTRL_SET_MODE (4) /* Set sensor's work mode */
#define OS_SENSOR_CTRL_SET_POWER (5) /* Set power mode */
#define OS_SENSOR_CTRL_SELF_TEST (6) /* Take a self test */
#define IOC_SET_CB (0x12345678) /* callback,arg=struct os_device_cb_info* */
该函数用于关闭传感器设备,函数原型如下:
os_err_t os_device_close(os_device_t *dev);
参数 | 说明 |
---|---|
dev | 设备句柄 |
返回 | 说明 |
OS_EOK | 关闭设备成功 |
OS_ERROR | 设备已经完全关闭,不能重复关闭设备 |
其他错误码 | 关闭设备失败 |
关闭设备接口和打开设备接口需配对使用,打开一次设备对应要关闭一次设备,这样设备才会被完全关闭,否则设备仍处于未关闭状态。
本例程为测试acce类型的sensor icm20608:
#include <drv_cfg.h>
#include <os_tick.h>
#include <stdio.h>
#include <shell.h>
#include <sensors/sensor.h>
static int sensor_acce_test(int argc, char *argv[])
{
int i;
char sensor_name[24];
struct os_sensor_data sensor_data;
if (argc != 2)
{
os_kprintf("usage:sensor_acce_test <sensor_name>\r\n");
return -1;
}
snprintf(sensor_name, sizeof(sensor_name) - 1, "acce_%s", argv[1]);
os_device_t *sensor = os_device_find(sensor_name);
OS_ASSERT(sensor != NULL);
os_device_open(sensor, OS_DEVICE_FLAG_RDWR);
for (i = 0; i < 10; i++)
{
os_device_read(sensor, 0, &sensor_data, sizeof(struct os_sensor_data));
os_kprintf("sensor acce (%d, %d, %d)\r\n",
sensor_data.data.acce.x,
sensor_data.data.acce.y,
sensor_data.data.acce.z);
os_task_mdelay(1000);
}
return 0;
}
SH_CMD_EXPORT(sensor_acce_test, sensor_acce_test, "sensor_acce_test");
运行结果如下:
sh>sensor_acce_test icm20608
sensor acce (296, -642, 724)
sensor acce (385, 840, 150)
sensor acce (-183, -322, 912)
sensor acce (398, 1034, 194)
sensor acce (774, 325, -299)
sensor acce (894, 566, 204)
sensor acce (136, 274, -915)
sensor acce (448, 354, 494)
sensor acce (688, -463, -373)
sensor acce (833, 255, -166)