树莓派Rust开发:rppal的I2c为何无法调用set_timeout等方法?
解决Rust rppal库I2C初始化的方法找不到错误
嘿,我一眼就发现问题所在啦!你遇到的这两个E0599错误,根源在于对Rust的Result类型理解不到位——I2c::new()方法返回的不是直接的I2c结构体实例,而是一个Result<rppal::i2c::I2c, rppal::i2c::Error>类型。
为什么会出错?
Rust设计Result类型是为了强制开发者处理潜在的错误(比如I2C设备未连接、权限不足、硬件故障等)。你现在的foo变量是Result类型,而set_timeout和set_slave_address是**I2c实例专属的方法**,Result类型根本没有这些方法,所以编译器才会报错说找不到它们。
修正后的代码方案
你需要先从Result中取出实际的I2c实例,同时处理可能的错误。这里有两种常用的方式:
方式1:用unwrap_or_else显式处理错误(适合快速原型)
use rppal::i2c::I2c; const ADDR: u16 = 0x27; fn main() { println!("hello world"); // 从Result中获取I2c实例,初始化失败则打印错误并退出 let mut foo = I2c::new().unwrap_or_else(|err| { eprintln!("I2C初始化失败: {}", err); std::process::exit(1); }); foo.set_timeout(1000); // set_slave_address也会返回Result,同样需要处理错误 foo.set_slave_address(ADDR).unwrap_or_else(|err| { eprintln!("设置从设备地址失败: {}", err); std::process::exit(1); }); }
方式2:让main返回Result(更优雅的错误处理)
从Rust 1.26版本开始,main函数可以返回Result类型,这样就能用?操作符自动向上传递错误:
use rppal::i2c::I2c; const ADDR: u16 = 0x27; // 让main返回Result,自动处理错误 fn main() -> Result<(), Box<dyn std::error::Error>> { println!("hello world"); // 用?取出I2c实例,错误会自动返回给调用者 let mut foo = I2c::new()?; foo.set_timeout(1000); // 同样用?处理set_slave_address的错误 foo.set_slave_address(ADDR)?; Ok(()) }
参考示例的处理方式
你提到的示例代码里,作者用了?操作符来处理Result——因为示例中的函数返回Result类型,所以可以直接用?来提取实例。你之前忽略了这一步错误处理,才导致了问题。
记住:Rust中所有涉及硬件、I/O的操作几乎都会返回Result,必须先处理错误拿到实例,才能调用实例的方法哦!
内容的提问来源于stack exchange,提问作者George Sanger
相关产品推荐
相关产品推荐

