rust-embedded / embedded-hal

A Hardware Abstraction Layer (HAL) for embedded systems
Apache License 2.0
1.99k stars 200 forks source link

Serial: Sending break condition #190

Open dbrgn opened 4 years ago

dbrgn commented 4 years ago

It seems like an embedded-hal driver cannot issue a USART break condition using only the embedded-hal serial trait, right?

A break condition is signaled to the module by keeping the UART_RX pin low for longer than the time to transmit a complete character. For example, at the default baud rate of 57600 bps keeping the UART_RX pin low for 938 us is a valid break condition, whereas at 9600 bps this would be interpreted as a 0x00 character. Thus, the break condition needs to be long enough to still be interpreted as such at the baud rate that is currently in use.

Also, in Wikipedia: https://en.wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter#Break_condition

It seems that a HAL would have to reconfigure the pin as GPIO output pin, pull it low for a certain duration (depending on baudrate), then reconfigure it as serial pin again.

Would it make sense to add a BreakCondition trait to the serial module?

trait BreakCondition {
    type Error;
    fn send_break_condition(&mut self) -> nb::Result<(), Self::Error>;
}

(Edit: Updated to take &mut self instead of self)

jonas-schievink commented 4 years ago

IMO taking self by value to work around limited HALs is not a good idea. HALs should consider implementing something like this API instead: https://github.com/stm32-rs/stm32l0xx-hal/pull/74

dbrgn commented 4 years ago

@jonas-schievink good call, I updated the proposal.

jonas-schievink commented 4 years ago

Okay, that wouldn't work with a nonblocking API I suppose