使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取

2024-01-31

我正在尝试使用 C++ 写入和读取 I2C 总线。我的I2C总线是虚拟的,第一件事是加载内核模块i2c_stub。我可以通过 bash 完成所有事情,现在我将其移植到 C++。我可以打开i2c总线,获取特定地址的i2c总线,但无法读写。

我正在虚拟化/dev/i2c-3。这些是我在 bash 中执行的命令:

sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) clean
sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

sudo modprobe -r i2c_stub
sudo insmod i2c-stub.ko chip_addr=0x20
sudo i2cset -y 3 0x20 0x00 0x01
sudo i2cget -y 3 0x20 0x00

这是 C++ 代码。写作失败了,如果我把它改为第一,阅读也失败了。我不确定我使用时是否是这样ioctl和地址I2C_SLAVE, 0x20。我不知道在哪里使用该地址0x00.

TEST_F(I2CTest, TestReadAndWriteI2C) {
// ------- LOAD i2c_stub KERNEL MODULE -------
char *params;
int fd;
size_t image_size;
struct stat st;
void *image;

// command: sudo insmod /root/i2c-tests/i2c-stub.ko chip_addr=0x20
params = "chip_addr=0x20";
fd = open("/root/i2c-tests/i2c-stub.ko", O_RDONLY);
fstat(fd, &st);
image_size = st.st_size;
image = malloc(image_size);
read(fd, image, image_size);
close(fd);
if (init_module(image, image_size, params) != 0) {
    perror("init_module");
    std::cout
            << "Please make sure that the following commands were executed " <<
            "on the directory [/root/i2c-tests/] before to run the unit test TestAddKernelModule " <<
            "and the file [/root/i2c-tests/i2c-stub.ko] exists." << std::endl;
    std::cout << "sudo rmmod i2c_stub" << std::endl;
    std::cout << "sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) clean" << std::endl;
    std::cout << "sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules" << std::endl;
    std::cout << "sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install" << std::endl;
    GTEST_FAIL();
}
free(image);
GTEST_SUCCESS_("Kernel module loaded.");


//----- OPEN THE I2C BUS -----
int file_i2c = open("/dev/i2c-3", O_RDWR);
ASSERT_GT(file_i2c, 0);
if (file_i2c < 0) {
    GTEST_FAIL(); // Failed to open the i2c bus
} else {
    // std::cout << "Opened i2c port: /dev/i2c-3" << std::endl;
    GTEST_SUCCESS_("Opened i2c port: /dev/i2c-3");
}

// <<<<< The I2C address of the slave
if (ioctl(file_i2c, I2C_SLAVE, 0x20) < 0) {
    std::cout << "ioctl error: " << strerror(errno) << std::endl;
    GTEST_FAIL(); // Failed to acquire bus access and/or talk to slave
} else {
    std::cout << "Acquired bus access to i2c address: " << I2C_ADDR << std::endl;
    GTEST_SUCCESS_("Acquired bus access to i2c address: " + I2C_ADDR);
}

//----- WRITE BYTES -----
char bufferToWrite[1];
bufferToWrite[0] = 0x01;
// <<< Number of bytes to write
if (write(file_i2c, bufferToWrite, 1) != 1) {
    GTEST_FAIL(); // Failed to write to the i2c bus
} else {
    GTEST_SUCCESS_("success writing on i2c");
}

//----- READ BYTES -----
char bufferToRead[1];
int numberOfBytesRead = read(file_i2c, bufferToRead, 1);
std::cout << "Data read: " << bufferToRead[0] << std::endl;
printf("0x%02X\n", bufferToRead[0]);
GTEST_SUCCESS_("Data read: " + bufferToRead[0]);
}

我解决了寻找如何接线PiI2C(https://github.com/WiringPi/WiringPi/blob/master/wiringPi/wiringPiI2C.c https://github.com/WiringPi/WiringPi/blob/master/wiringPi/wiringPiI2C.c)做了并修改了我的代码上的一些点。

TEST_F(I2CTest, TestReadAndWriteI2C) {
    // ------- LOAD i2c_stub KERNEL MODULE -------
    char *params;
    int fd;
    size_t image_size;
    struct stat st;
    void *image;

    // command: sudo insmod /root/i2c-tests/i2c-stub.ko chip_addr=0x20
    params = "chip_addr=0x20";
    fd = open("/root/i2c-tests/i2c-stub.ko", O_RDONLY);
    fstat(fd, &st);
    image_size = st.st_size;
    image = malloc(image_size);
    read(fd, image, image_size);
    close(fd);
    if (init_module(image, image_size, params) != 0) {
        perror("init_module");
        std::cout
                << "Please make sure that the following commands were executed " <<
                "on the directory [/root/i2c-tests/] before to run the unit test TestAddKernelModule " <<
                "and the file [/root/i2c-tests/i2c-stub.ko] exists." << std::endl;
        std::cout << "sudo rmmod i2c_stub" << std::endl;
        std::cout << "sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) clean" << std::endl;
        std::cout << "sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules" << std::endl;
        std::cout << "sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install" << std::endl;
        GTEST_FAIL();
    }
    free(image);
    GTEST_SUCCESS_("Kernel module loaded.");

    // This initialises the I2C system with your given device identifier.
    int i2cFileDescriptor;
    if ((i2cFileDescriptor = open("/dev/i2c-3", O_RDWR)) < 0) {
        GTEST_FAIL();
    }
    if (ioctl(i2cFileDescriptor, I2C_SLAVE, 0x20) < 0) {
        GTEST_FAIL();
    }

    // Write bytes on I2C bus
    union i2c_smbus_data data;
    data.byte = 5;
    i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_WRITE, 0x00, I2C_SMBUS_BYTE_DATA, &data);

    // Read bytes from I2C bus
    union i2c_smbus_data dataRead;
    if (i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_READ, 0x00, I2C_SMBUS_BYTE_DATA, &dataRead)) {
        GTEST_FAIL();
    } else {
        ASSERT_EQ(data.byte, dataRead.byte);
        std::cout << "Read: " << std::hex << static_cast<int>(dataRead.byte ) << std::endl;
        std::cout << "Read: " << (int) dataRead.byte << std::endl;
        GTEST_SUCCESS_("Read bytes from I2C bus.");
    }

    // Write word on I2C bus
    data.word = 556;
    i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_WRITE, 0x00, I2C_SMBUS_WORD_DATA, &data);

    // Read word from I2C bus
    union i2c_smbus_data wordRead;
    if (i2c_smbus_access(fd, I2C_SMBUS_READ, 0x00, I2C_SMBUS_WORD_DATA, &wordRead)) {
        GTEST_FAIL();
    } else {
        ASSERT_EQ(data.word, wordRead.word);
        std::cout << "Read: " << std::hex << static_cast<int>(wordRead.word ) << std::endl;
        std::cout << "Read: " << (int) wordRead.word << std::endl;
        std::cout << "Read: " << wordRead.word << std::endl;
        GTEST_SUCCESS_("Read word from I2C bus.");
    }
    // return data.word & 0xFFFF ;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取 的相关文章

  • 如何使用 Entity Framework 和 Identity 解决对象处置异常 ASP.NET Core

    我正在尝试编写一个控制器 该控制器接收来自 AJAX 调用的请求并通过 DBContext 对数据库执行一些调用 但是 当我发出命令时var user await GetCurrentUserAsynch 在对 DBContext 的任何调
  • 信号与信号2

    我的应用程序可能会受益于使用 boost 的信号库之一而不是本土解决方案 该应用程序是多线程的 但执行信号处理的部分是单线程的 如果多线程不是问题 是否有任何理由更喜欢 Boost Signals2 而不是 Boost Signal Boo
  • 头文件中实现的函数的静态与内联

    我想到的方式inline在 C 中用于链接 作用域 我把它放在同一个篮子里extern and static对于全局对象 通常 对于在头文件中实现的函数 我的首选解决方案是将其设为静态 In Foo h static void foo Do
  • C# 中类似图的实现

    所以我有一个对象 我们称之为 Head 它有一个对象列表 C C1 C2 C3 T T1 T2 和 M M1 M2 并且所有这些都是相互关联的 例如 Head gt C1 C2 C3 T1 T2 M1 M2 T1 gt C1 C2 T2 g
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • C# 中 PKCS11Interop 库的线程安全使用 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 PKCS11Interop 在 HSM 内执行密钥管理操作 我使用的 HSM 是 Thales PCI Express 下面是
  • 无法将参数从 `const char *` 转换为 `char *`

    鉴于此代码 void group build int size std string ips Build the LL after receiving the member list from bootstrap head new memb
  • 如何调试.NET Windows Service OnStart方法?

    我用 NET 编写的代码仅在作为 Windows 服务安装时才会失败 该故障甚至不允许服务启动 我不知道如何进入 OnStart 方法 如何 调试 Windows 服务应用程序 http msdn microsoft com en us l
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • ASP.net WebForms - 在标记中使用 GetRouteUrl

    我一直在尝试弄清楚如何将路由功能与 ASP net 4 0 WebForms 一起使用 我将一条路线添加到我的路线集合中 void Application Start RegisterRoutes RouteTable Routes voi
  • 本地时间的内存需要释放吗?

    void log time t current time 0 tm ptm localtime current stuf 只是想确定 我是否需要在方法结束时释放 tm 指针分配的内存 不 你不应该释放它 该结构是静态分配的 检查文档 htt
  • linq where 子句和 count 导致 null 异常

    除非 p School SchoolName 结果为 null 否则下面的代码将起作用 在这种情况下 它会导致 NullReferenceException if ExistingUsers Where p gt p StudentID i
  • 如何禁用基于 ValidationRule 类的按钮?

    如何禁用基于 ValidationRule 类的 WPF 按钮 下面的代码可以很好地突出显示 TextBox
  • 从具有相同属性的另一个对象创建对象

    我有一个 C 对象 可以说有 20 个属性 它是数据契约的一部分 我还有另一个具有类似属性的业务实体 我想从响应对象中填充该实体 除了将一个对象的每个属性分配给另一个对象的相应属性之外 还有其他方法可以做到这一点吗 是的 看看自动映射器 h
  • 意外的 const 引用行为

    include
  • 强制函数调用的顺序?

    假设我有一个抽象基类 并且我想要一个必须由派生类实现的纯虚方法 但我想确保派生方法以特定顺序调用函数 我可以做什么来强制执行它 I E base class virtual void doABC 0 virtual void A 0 vir
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有
  • 在 LP2844Z(Zebra 打印机)上的收据中包含 PNG [重复]

    这个问题在这里已经有答案了 我正在致力于创建一个基于 HTML5 画布的签名 绘图框 目前我们在服务器上将画布保存为PNG 但可以轻松地将base64字符串保存在数据库中 现在的问题是我们如何在打印的收据上添加签名 目前我们使用 GF 字段
  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和

随机推荐

  • 当附加调试器时,从 .Net 代码调用 C++ dll 的速度极其缓慢

    我正在使用 VS 2008 来编译和调试我的代码 在我的应用程序中 前端是C 后端是C 我通过互操作访问 C 代码 我注意到的一件事是 如果我按 F5 并链接本机代码的调试版本 则运行本机代码将需要 20 秒以上 如果我链接到本机代码的发布
  • 确定 android 中的互联网速度

    我正在开发一个 Android 视频流应用程序 我必须检测互联网速度以根据该速度调整我的流质量 我在网上搜索了如何在android中检测互联网速度 但我发现只有一种下载文件并了解其大小以确定带宽的方法 bandwidth contentLe
  • 蓝牙、wifi 和铃声模式的广播意图

    以下事件中广播的意图是什么 WiFi状态改变 蓝牙状态改变 振铃模式更改 For 无线网络状态变化 WifiManager WIFI STATE CHANGED ACTION http developer android com refer
  • DAAB,使用数据库实例的最佳方法是

    伙计们 我将使用 Enterprise Library 4 1 尤其是 DAAB 这是我有问题 最好的方法是什么以及原因 每当我需要运行时 DbCommand 我创建数据库实例 使用 DatabaseFactory CreateDataba
  • 在chrome扩展中,如何使用内容脚本注入Vue页面

    我正在尝试实现 JSON 查看器 chrome 扩展 我已经用 Vue 实现了查看器 http treedoc org http treedoc org 现在的问题是如何使用 Chrome 扩展内容脚本注入 Vue 页面 I found 这
  • Cassandra BETWEEN 和 ORDER BY 操作

    我想在 Cassandra 0 7 8 上执行 SQL 操作 例如 BETWEEN ORDER BY 和 ASC DSC 顺序 据我所知 Cassandra 0 7 8 并不直接支持这些操作 请让我知道有没有办法通过调整二级索引来完成这些
  • Mac OS X 上我的 .emacs 文件在哪里

    所以我尝试将 google go 模块添加到我的 emacs 文件中 以便当我使用 emacs 编辑我的 go 文件时 它将具有适当的缩进和单词突出显示 我在网上查看过 似乎我需要将以下代码片段添加到我的 emacs 文件中 我找不到 go
  • Python3中map的非惰性评估版本?

    我正在尝试使用map在Python3 这是我正在使用的一些代码 import csv data 1 2 3 with open output csv w as f writer csv writer f map writer writero
  • 打开 时变量为空 - JFS 2.0、Primefaces

    你好吗 也许现在是新手问题 现在我在表单中有一个输入和一个 提交 按钮 当我点击提交时 这不会调用任何方法 这只是打开一个
  • Keras 中的 fit_generator 中的worker 是什么意思?

    我有一个大数据集存储在tfrecord像 333 这样的文件用于训练 所以我将数据分成多个文件 例如 1024 tfrecords 文件 而不是一个 我在 tf Dataset Api 中使用了输入管道 喜欢 ds ds TFRecords
  • Opengl 着色器问题 - 奇怪的光反射伪影

    我已经为此奋斗了好几天 我想我终于将问题范围缩小到了每个顶点切线的问题 但我不确定解决它的最佳方法 上下文是 iPhone 应用程序 opengl es2 使用我自己的引擎 我的着色器是凹凸贴图 法线贴图 类型 使用提供的每个顶点切线来创建
  • 我可以使用 ul li 而不是 select dropdown 并使用 jquery 使其成为表单的一部分吗?

    我花了很长时间尝试将 select 重写为 ul li 并相应地设置其样式 但我对代码的重量和途中的小烦恼感到非常恼火 所以我想完全放弃这个想法 只使用普通的 ul li 菜单和某种 javascript 来使其功能像 select 用于表
  • gulp browserify reactify 任务相当慢

    我使用 Gulp 作为我的任务运行程序 并使用 browserify 来捆绑我的 CommonJs 模块 我注意到运行 browserify 任务非常慢 大约需要 2 3 秒 而我所拥有的只是 React 和一些我为开发而构建的非常小的组件
  • 如何在 MySQL 中搜索以 A 开头的名称?

    我有一个问题 我们如何使用 SELECT 来搜索 MySQL 表中以 A 开头的名称 谢谢 SELECT FROM table name WHERE columnname LIKE A
  • 为什么我无法使用 Rails 4.0.0.rc1 (ruby 2.0) 安装 postgresql

    第一次上论坛 所以我会尽量具体 对于任何可能的拼写错误 我们深表歉意 好吗 我对 Rails 比较陌生 不到一年 我想创建一个默认项目来使用它 我一直在开发中使用sqlite3 在生产中使用pg heroku 但现在我想把事情做好 我遇到了
  • C# MongoDb 连接到副本集问题

    根据 mongodb 网站 如果我只给副本集中的一个成员 我应该能够连接到副本集 即使种子列表不完整 C 驱动程序也能够连接到副本集 即使主服务器不在种子列表中 只要种子列表中至少有一台服务器做出响应 它就会找到主服务器 响应将包含完整的副
  • 如何在检测到 AccessViolationException 时强制应用程序崩溃

    我们使用自动崩溃报告工具 即http crashrpt sourceforge net http crashrpt sourceforge net 用于生成崩溃报告 因此 如果一段非托管代码通过访问NULL例如 指针 应用程序崩溃 崩溃报告
  • 使用 python requests 登录网站

    我在从 python 脚本登录网站时遇到一些困难 以便稍后在连接后从中检索数据 我认为 HTML 页面中包含需要用户名和密码的表单的部分如下 div class contentLogin div
  • 我可以在浏览器 ui 线程和 web 工作线程中安全地使用 html5 中的哪些本地存储

    我一直在尝试使用Web SQL 数据库 API在基于 webkit 的浏览器中 我一直在使用异步API主要在用户界面线程 and a 网络工作者 两个线程都访问同一个数据库 正如您所知 其背后是 sqlite 一切都表现良好 但偶尔会有事务
  • 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取

    我正在尝试使用 C 写入和读取 I2C 总线 我的I2C总线是虚拟的 第一件事是加载内核模块i2c stub 我可以通过 bash 完成所有事情 现在我将其移植到 C 我可以打开i2c总线 获取特定地址的i2c总线 但无法读写 我正在虚拟化