Struct profirust::phy::LinuxRs485Phy
source · pub struct LinuxRs485Phy<'a> { /* private fields */ }
Expand description
Linux userspace PHY implementation for serial TTY devices
Available with the phy-linux
feature.
Important: Due to the non-realtime nature of Linux, you must use this PHY implementation with care. You may need to decrease the baudrate or lengthen timeouts (TSLOT) to get reliable communication. You should also consider running your pogram at “real-time priority” if you need higher bus speeds. It is advisable to run tests with heavy system load to ensure the bus communication stays reliable in all circumstances.
Important 2: If you plan to use this PHY with a USB-serial device, you have to choose your
bus parameters even more carefully. Stick to very low baudrates (<= 500kbit/s) and increase
TSL (slot time) to deal with communication delays. Tests have shown a slot time of
~5ms to work reliably (at 500kbit/s, that would be 2500 T_bit). Additionally, it seems to be
important to give the OS time to deliver received data by sleeping long enough between poll()
calls. A minimum sleep of 2ms was needed in my tests to ensure all received data is delivered
in time.
§Example
use profirust::{Baudrate, fdl, dp, phy};
const BAUDRATE: Baudrate = Baudrate::B19200;
let mut fdl_master = fdl::FdlMaster::new(
fdl::ParametersBuilder::new(0x02, BAUDRATE)
// Increase T_slot (slot time)
.slot_bits(1920)
.build_verified(&dp_master)
);
let mut phy = phy::LinuxRs485Phy::new("/dev/ttyS0", fdl_master.parameters().baudrate);
Implementations§
source§impl LinuxRs485Phy<'_>
impl LinuxRs485Phy<'_>
sourcepub fn new<P: AsRef<Path>>(serial_port: P, baudrate: Baudrate) -> Self
pub fn new<P: AsRef<Path>>(serial_port: P, baudrate: Baudrate) -> Self
Construct and initialize a new PHY device
This function will attempt to configure the TTY device serial_port
for PROFIBUS
communication (line settings via termios and RS-485 mode when available).
sourcepub fn wait_transmit(&mut self)
pub fn wait_transmit(&mut self)
Wait/block until the current transmission completes.
This is useful to save CPU time as the PROFIBUS stack can’t do much anyway until the transmission is over.
Trait Implementations§
source§impl<'a> Debug for LinuxRs485Phy<'a>
impl<'a> Debug for LinuxRs485Phy<'a>
source§impl<'a> ProfibusPhy for LinuxRs485Phy<'a>
impl<'a> ProfibusPhy for LinuxRs485Phy<'a>
source§fn poll_transmission(&mut self, _now: Instant) -> bool
fn poll_transmission(&mut self, _now: Instant) -> bool
source§fn transmit_data<F, R>(&mut self, _now: Instant, f: F) -> R
fn transmit_data<F, R>(&mut self, _now: Instant, f: F) -> R
source§fn receive_data<F, R>(&mut self, _now: Instant, f: F) -> R
fn receive_data<F, R>(&mut self, _now: Instant, f: F) -> R
source§fn transmit_telegram<F>(
&mut self,
now: Instant,
f: F
) -> Option<TelegramTxResponse>
fn transmit_telegram<F>( &mut self, now: Instant, f: F ) -> Option<TelegramTxResponse>
Auto Trait Implementations§
impl<'a> Freeze for LinuxRs485Phy<'a>
impl<'a> RefUnwindSafe for LinuxRs485Phy<'a>
impl<'a> Send for LinuxRs485Phy<'a>
impl<'a> Sync for LinuxRs485Phy<'a>
impl<'a> Unpin for LinuxRs485Phy<'a>
impl<'a> !UnwindSafe for LinuxRs485Phy<'a>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
source§impl<T> FmtForward for T
impl<T> FmtForward for T
source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> R
source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.source§impl<T> Tap for T
impl<T> Tap for T
source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moresource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moresource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moresource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moresource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moresource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moresource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.