diff --git a/firmware/rust1/src/dont_abort.rs b/firmware/rust1/src/dont_abort.rs
index 29544a119a37cc0d7a4b51f80031335ceb554166..8ea3b3fa86bc9b6cf4940ace323d837c81885792 100644
--- a/firmware/rust1/src/dont_abort.rs
+++ b/firmware/rust1/src/dont_abort.rs
@@ -2,9 +2,15 @@ use core::future::*;
 use core::pin::Pin;
 use core::task::*;
 
+pub enum DontAbortMode {
+    PanicIfReused,
+    HangIfReused,
+}
+
 pub struct DontAbort<A> {
     a: A,
-    done: bool
+    done: bool,
+    mode: DontAbortMode,
 }
 
 pub struct DontAbortFuture<'a, A> {
@@ -12,8 +18,8 @@ pub struct DontAbortFuture<'a, A> {
 }
 
 impl<A> DontAbort<A> {
-    pub fn new(a: A) -> DontAbort<A> {
-        DontAbort { a, done: false }
+    pub fn new(a: A, mode: DontAbortMode) -> DontAbort<A> {
+        DontAbort { a, done: false, mode }
     }
 
     #[allow(dead_code)]
@@ -38,7 +44,10 @@ where
     fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
         let this = unsafe { self.get_unchecked_mut() };
         if this.inner.done {
-            panic!("Ready future is called again!");
+            match this.inner.mode {
+                DontAbortMode::PanicIfReused => panic!("Ready future is called again!"),
+                DontAbortMode::HangIfReused => return Poll::Pending,  // will never finish because we haven't scheduled ourselves again
+            }
         }
         let a = unsafe { Pin::new_unchecked(&mut this.inner.a) };
         if let Poll::Ready(x) = a.poll(cx) {
diff --git a/firmware/rust1/src/rs485.rs b/firmware/rust1/src/rs485.rs
index 8a22f998e12001e467a03cbd32df93150fd477c3..2b1919d7c6efa2768bb3ec4477b644de02ef4836 100644
--- a/firmware/rust1/src/rs485.rs
+++ b/firmware/rust1/src/rs485.rs
@@ -15,6 +15,7 @@ use fixed::traits::ToFixed;
 use fixed_macro::types::U56F8;
 
 use crate::dont_abort::DontAbort;
+use crate::dont_abort::DontAbortMode::*;
 
 pub struct RS485 {
     pio: peripherals::PIO0,
@@ -255,7 +256,6 @@ impl RS485 {
             }
             tx_data[i] = x | ((parity&1) << 8);
         }
-        info!("tx_data: {:?}", tx_data);
 
 
         let mut dma_in_ref = self.dma_channel.into_ref();
@@ -263,8 +263,8 @@ impl RS485 {
         let mut din = [42u32; 9];
         let mut bit_index = 0;
         let mut rx_buf = [0; 1];
-        let mut rx_future = DontAbort::new(self.rx.read(&mut rx_buf));
-        let mut tx_future = DontAbort::new(sm1.tx().dma_push(dma_tx_ref.reborrow(), &tx_data));
+        let mut rx_future = DontAbort::new(self.rx.read(&mut rx_buf), PanicIfReused);
+        let mut tx_future = DontAbort::new(sm1.tx().dma_push(dma_tx_ref.reborrow(), &tx_data), HangIfReused);
         loop {
             let x = select4(
                 irq0.wait(),
@@ -361,20 +361,23 @@ impl RS485 {
                     }
                 },
                 Either4::Third(_) => {
-                    drop(tx_future);
-                    tx_future = DontAbort::new(sm1.tx().dma_push(dma_tx_ref.reborrow(), &tx_data));
+                    //drop(tx_future);
+                    //tx_future = DontAbort::new(sm1.tx().dma_push(dma_tx_ref.reborrow(), &tx_data), HangIfReused);
                 },
                 Either4::Fourth(Either::First(x)) => {
                     drop(rx_future);
                     match x {
                         Result::Ok(()) => {
                             info!("RX {:?}", rx_buf);
+
+                            drop(tx_future);
+                            tx_future = DontAbort::new(sm1.tx().dma_push(dma_tx_ref.reborrow(), &tx_data), HangIfReused);
                         },
                         Result::Err(e) => {
                             info!("RX error {:?}", e);
                         },
                     }
-                    rx_future = DontAbort::new(self.rx.read(&mut rx_buf));
+                    rx_future = DontAbort::new(self.rx.read(&mut rx_buf), PanicIfReused);
                 },
                 _ => {
                 },