为什么这个rppal I2c结构没有任何方法?

时间:2019-06-29 12:03:26

标签: rust raspberry-pi i2c

我一直在树莓派上玩Rust,希望构建一个咖啡机控制器。我很早就遇到了这个问题。 我正在使用rppal库,希望为LCD屏幕创建i2c驱动程序。

error[E0599]: no method named `set_timeout` found for type `std::result::Result<rppal::i2c::I2c, rppal::i2c::Error>` in the current scope
 --> src/main.rs:8:6
  |
8 |     foo.set_timeout(1000);
  |         ^^^^^^^^^^^

error[E0599]: no method named `set_slave_address` found for type `std::result::Result<rppal::i2c::I2c, rppal::i2c::Error>` in the current scope
 --> src/main.rs:9:6
  |
9 |     foo.set_slave_address(ADDR);
  |         ^^^^^^

我基本上是在跟踪示例,但是似乎无法用所需的方法创建strut!感觉好像我缺少一些简单的东西!

这里是代码,不多。

use rppal::i2c::I2c;

const ADDR: u16 = 0x27;

fn main() {
    println!("hello world");
    let mut foo = I2c::new();
    foo.set_timeout(1000);
    foo.set_slave_address(ADDR);
}

这是图书馆-> https://github.com/golemparts/rppal 我尝试复制的示例-> https://github.com/golemparts/rppal/blob/master/examples/i2c_ds3231.rs

非常感谢!

1 个答案:

答案 0 :(得分:0)

在您发布的示例中,有以下行:

let mut i2c = I2c::new()?;

问号不是偶然的。请注意,在错误中您会在代码中得到i2c的类型:

error[E0599]: no method named `set_timeout` found for type `std::result::Result<rppal::i2c::I2c, rppal::i2c::Error>` in the current scope
 --> src/main.rs:8:6
  |
8 |     foo.set_timeout(1000);
  |     

它不是i2c,而是Result<i2c, Error>。在这种情况下,问号会解压缩Result,如果是错误,则会将其升级到当前函数之外。

请注意,要使此方法起作用,当前函数还必须返回Result类型,因此应将示例中给出的main()函数签名与fn main() -> Result<(), Box<dyn Error>>

匹配。