Skip to content

Instantly share code, notes, and snippets.

@sajattack
Created February 18, 2019 13:20
Show Gist options
  • Select an option

  • Save sajattack/101d629fe5d9379f30be5a50eb86973b to your computer and use it in GitHub Desktop.

Select an option

Save sajattack/101d629fe5d9379f30be5a50eb86973b to your computer and use it in GitHub Desktop.
bitbang uart rx
impl <TX, RX, Delay> serial::Read<u8> for Serial <TX, RX, Delay>
where
TX: OutputPin,
RX: InputPin,
Delay: DelayUs<u32>
{
type Error = ();
fn read(&mut self) -> nb::Result<u8, Self::Error> {
if self.reading || self.writing {
return Err(nb::Error::WouldBlock)
}
let mut data_in = 0;
// wait for start bit
if self.rx.is_high() {
return Err(nb::Error::WouldBlock)
}
self.reading = true;
self.delay.delay_us((self.delay_time as f32 * 1.5) as u32);
let mut buf: u16 = 0;
for _ in 0..8 {
let mut bit: u8 = 0;
for _ in 0..4 {
buf <<= 1;
if self.rx.is_high() {
buf |= 1;
}
if buf == 0b0011 || buf == 0b1110 || buf == 0b0111 || buf == 0b1100 || buf == 0b0110 || buf == 0b1111{
bit = 1;
}
self.delay.delay_us(self.delay_time/4);
}
data_in <<= 1;
data_in |= bit;
}
// wait for stop bit
self.delay.delay_us(self.delay_time);
self.reading = false;
Ok(data_in)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment