所以当我学习 Rust 时,我想在 stm32l0xx-hal 中为 uart 编写一个包装器 据了解,我不断收到的错误是 impl 中的 USART 模板与结构声明不同
代码:
pub struct Uart<USART, TX, RX> {
_tx: serial::Tx<USART>,
_rx: serial::Rx<USART>,
_tx_pin: TX,
_rx_pin: RX
}
impl<USART: serial::Serial2Ext<TX,RX>, TX, RX> Uart<USART, TX,RX> {
pub fn new
(usart: USART, mut rcc: rcc::Rcc, tx_pin: TX, rx_pin: RX) -> Self {
let serial = usart
.usart(tx_pin, rx_pin, serial::Config::default(), &mut rcc)
.unwrap();
let (tx, rx) = serial.split();
Uart{
_tx : tx, // <- error
_rx : rx, // <- error
_tx_pin : tx_pin,
_rx_pin : rx_pin
}
}
}
错误:
error[E0308]: mismatched types
--> src/uart.rs:28:19
|
17 | impl<USART: serial::Serial2Ext<TX,RX>, TX, RX> Uart<USART, TX,RX> {
| ----- expected this type parameter
...
28 | _tx : tx,
| ^^ expected `Tx<USART>`, found `Tx<USART2>`
|
= note: expected struct `stm32l0xx_hal::serial::Tx<USART>`
found struct `stm32l0xx_hal::serial::Tx<stm32l0xx_hal::serial::USART2>`
stm32l0xx_hal::serial::USART2
- 是我传递给新函数的 usart 类型
问题是你对编译器撒谎:
new
块中编写的impl
函数表示它将返回调用者选择的任何
Uart<USART, TX, RX>
(只要USART: serial::Serial2Ext<TX,RX>
) 。但随后,它不会将调用者选择的泛型类型
_tx
的值分配给
UART
,而是尝试分配特定类型
UART2
。如果
UART
是
UART2
就可以了,但是
impl
块没有这么说。如果
Serial2Ext
定义了一个关联类型,那么就可以保留泛型,这样就可以约束
impl
(“这里的类型尚未定义,但它是任何
Serial2Ext
说将从
uart()
返回给定的
(TX, RS)
),因为它没有,所以不可能 - 不添加更多代码 - 让
UART
成为泛型类型并且。 同时使用特定类型。 最简单的方法是删除通用参数
UART
并将其替换为特定类型
UART2
,因为这是
Serial2Ext::uart
在
Ok
情况下将返回的内容。