Rust 如何读取STM32 Nucleo-L433-RC上的uart数据

Rust 如何读取STM32 Nucleo-L433-RC上的uart数据,rust,embedded,uart,Rust,Embedded,Uart,我正在尝试从NUCLEO-L433RC-P上的uart读取数据,并将其回显。我以为调用tx.read()就足够了,但它不是这样工作的。在uart上写操作很好。在初始化外围设备时,我是否遗漏了一些内容,或者只是读取了错误的函数 #![deny(unsafe_code)] #![no_main] #![no_std] extern crate cortex_m; #[macro_use(exception)] extern crate cortex_m_rt as rt; extern crate


我正在尝试从NUCLEO-L433RC-P上的uart读取数据,并将其回显。我以为调用tx.read()就足够了,但它不是这样工作的。在uart上写操作很好。在初始化外围设备时,我是否遗漏了一些内容,或者只是读取了错误的函数

#![deny(unsafe_code)]
#![no_main]
#![no_std]

extern crate cortex_m;
#[macro_use(exception)]
extern crate cortex_m_rt as rt;
extern crate panic_semihosting;
extern crate stm32l4xx_hal as hal;
#[macro_use(block)]
extern crate nb;

use hal::prelude::*;
use hal::serial::{Config, Serial};
use rt::entry;
use rt::ExceptionFrame;

#[entry]
fn main() -> ! {
    let hal_peripherals = hal::stm32::Peripherals::take().unwrap();
    let mut flash = hal_peripherals.FLASH.constrain();
    let mut rcc = hal_peripherals.RCC.constrain();
    let clocks = rcc
        .cfgr
        .sysclk(80.mhz())
        .pclk1(80.mhz())
        .pclk2(80.mhz())
        .freeze(&mut flash.acr);
    let mut gpiob = hal_peripherals.GPIOB.split(&mut rcc.ahb2);
    let mut gpioa = hal_peripherals.GPIOA.split(&mut rcc.ahb2);
    let mut led = gpiob
        .pb13
        .into_push_pull_output(&mut gpiob.moder, &mut gpiob.otyper);
    let tx = gpioa.pa2.into_af7(&mut gpioa.moder, &mut gpioa.afrl);
    let rx = gpioa.pa3.into_af7(&mut gpioa.moder, &mut gpioa.afrl);
    let serial = Serial::usart2(
        hal_peripherals.USART2,
        (tx, rx),
        Config::default().baudrate(115_200.bps()),
        clocks,
        &mut rcc.apb1r1,
    );
    let (mut tx, mut rx) = serial.split();

    for i in "Hello World!!!\r\n".as_bytes().iter() {
        block!(tx.write(*i)).ok();
    }

    loop {
        let res = rx.read();
        if res.is_ok() {
            led.set_high().unwrap();
            let char = res.unwrap();
            block!(tx.write(char)).ok();
        } else {
            led.set_low().unwrap();
        }
    }
}

#[exception]
fn HardFault(ef: &ExceptionFrame) -> ! {
    panic!("{:#?}", ef);
}

在从usart2更改为usart1并使用其他引脚后,它可以工作