К примеру посылаю в uart "led on" по которой запускается подпрограмма 1 и "led off" по которой запускается подпрограмма 2. Так же в uart могут придти другие команды или шум, которые не нужно обрабатывать как это реализовать?
1. Шума в UART быть не должно. Это цифровой протокол.
2. Конфигурируешь uart
3. Читаешь из потока данные через read! и readln!
4. Декодируешь данные
5. Через if или match выбираешь, что надо сделать
#![deny(unsafe_code)]
#![no_main]
#![no_std]
use panic_halt as _;
//use cortex_m::asm;
use nb::block;
use cortex_m_rt::entry;
use stm32f1xx_hal::{
pac,
prelude::*,
serial::{Config, Serial},
timer::Timer,
};
use embedded_hal::digital::v2::OutputPin;
#[entry]
fn main() -> ! {
// Get access to the device specific peripherals from the peripheral access crate
let p = pac::Peripherals::take().unwrap();
let cp = cortex_m::Peripherals::take().unwrap();
let mut flash = p.FLASH.constrain();
let mut rcc = p.RCC.constrain();
let clocks = rcc.cfgr.freeze(&mut flash.acr);
// Prepare the alternate function I/O registers
let mut afio = p.AFIO.constrain(&mut rcc.apb2);
// Prepare the GPIOB peripheral
let mut gpioa = p.GPIOA.split(&mut rcc.apb2);
let mut gpioc = p.GPIOC.split(&mut rcc.apb2);
// USART1
let tx = gpioa.pa9.into_alternate_push_pull(&mut gpioa.crh);
let rx = gpioa.pa10;
let mut serial = Serial::usart1(
p.USART1,
(tx, rx),
&mut afio.mapr,
Config::default().baudrate(115200.bps()),
clocks,
&mut rcc.apb2,
);
let sent = b'X';
block!(serial.write(sent)).ok();
let mut led = gpioc.pc13.into_push_pull_output(&mut gpioc.crh);
let mut timer = Timer::syst(cp.SYST, &clocks)
.start_count_down(1.hz());
loop {
let received = block!(serial.read()).unwrap();
block!(serial.write(received)).ok();
//block!(timer.wait()).unwrap();
//led.set_high().unwrap();
//block!(timer.wait()).unwrap();
//led.set_low().unwrap();
}
}
вот в этом коде если послать на вход уарт символ то этот символ отправляется на выход только один раз а потом ничего не происходит,,