获取 rust arduino_hal 中的引脚号

问题描述 投票:0回答:1

我正在尝试将firmata固件移植到rust中,更多的是作为学习arduino编码的练习而不是其他任何东西。

但是,我需要知道引脚号,实际上协议的一部分需要使用引脚号进行代数以发送到串行端口,例如

REPORT_ANALOG | (pin_number & 0xF)

但是,当我通过

pin!
实例化引脚时,该对象不允许我访问引脚编号。

我正在尝试不同的方法,例如进行匹配案例以在自定义结构中实例化引脚以存储引脚号,

let pin = match pin_number {
            0 => pins.d0,
            1 => pins.d1,
            2 => pins.d2,
            ...

但我遇到打字问题,因为似乎没有通用的引脚类型

`match` arms have incompatible types
expected struct `avr_hal_generic::port::Pin<_, PD0>`
   found struct `avr_hal_generic::port::Pin<_, PD1>

有没有一种方法,甚至

unsafe
来取回密码?

rust arduino hal rust-no-std
1个回答
0
投票

可能有更好的方法来实现 Firmata 协议,但如果您需要将类型转换为数字,您可以使用特征来实现:

fn pin_number<MODE, PIN: PinNumber>(_: &avr_hal_generic::port::Pin<MODE, PIN>) -> usize {
    PIN::PIN_NUMBER
} 
trait PinNumber {
    const PIN_NUMBER: usize;
}
impl PinNumber for PD0 {
    const PIN_NUMBER: usize = 0;
}
impl PinNumber for PD1 {
    const PIN_NUMBER: usize = 1;
}
// …
© www.soinside.com 2019 - 2024. All rights reserved.