You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fedora系统下I2C总线发送数据缓冲区的技术求助

Fedora下I2C字符缓冲区发送的可行实现

原代码问题分析

你的代码存在几个关键问题导致数据发送异常:

  • args.size = 4 是错误用法:size 参数表示I2C操作类型(如I2C_SMBUS_BLOCK_DATA),而非数据长度
  • 数据缓冲区 dt[3] 空间不足:若要发送3字节数据,块数据模式下需要额外1字节存储数据长度,缓冲区至少需要4个元素
  • 未对系统调用返回值做错误检查,无法定位open/ioctl的调用失败情况

可行代码实现

以下是修正后的完整代码,包含错误检查和正确的块数据发送逻辑:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>

int main() {
    const char *i2c_path = "/dev/i2c-1"; // 根据你的硬件修改总线编号
    int fd;
    struct i2c_smbus_ioctl_data args;
    union i2c_smbus_data data_buf[4]; // 1字节长度 + 3字节数据

    // 打开I2C设备
    fd = open(i2c_path, O_RDWR);
    if (fd < 0) {
        perror("Failed to open I2C device");
        return 1;
    }

    // 设置目标设备地址(根据你的设备修改)
    if (ioctl(fd, I2C_SLAVE, 0xXX) < 0) { // 替换0xXX为你的I2C设备地址
        perror("Failed to set I2C slave address");
        close(fd);
        return 1;
    }

    // 配置SMBus写操作参数
    args.read_write = I2C_SMBUS_WRITE;
    args.command = 0x0d; // 目标寄存器地址
    args.size = I2C_SMBUS_BLOCK_DATA; // 块数据操作类型
    data_buf[0].byte = 3; // 要发送的数据长度
    data_buf[1].byte = 0xe7;
    data_buf[2].byte = 0x3f;
    data_buf[3].byte = 0x00;
    args.data = data_buf;

    // 执行I2C发送
    if (ioctl(fd, I2C_SMBUS, &args) < 0) {
        perror("Failed to send I2C data");
        close(fd);
        return 1;
    }

    close(fd);
    printf("Data sent successfully\n");
    return 0;
}

关键注意事项

  • 替换代码中的/dev/i2c-1为你的实际I2C总线设备路径(可通过ls /dev/i2c-*查看)
  • 将0xXX替换为你的I2C从设备地址
  • 若需要发送更多字节,只需调整data_buf的大小,同时修改data_buf[0].byte的数据长度值
  • 编译时需链接必要的库:gcc i2c_send.c -o i2c_send

内容的提问来源于stack exchange,提问作者albert waissman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:14:58