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
相关产品推荐
相关产品推荐

