From ca65b83d8be6bf253e1404a780314edef56a48bf Mon Sep 17 00:00:00 2001 From: Federico Lolli <federico123579@gmail.com> Date: Thu, 18 Apr 2024 19:41:48 +0200 Subject: [PATCH] Fixed some timing and release issues --- src/serial.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/serial.rs b/src/serial.rs index 32ee2b7..fdb7df3 100644 --- a/src/serial.rs +++ b/src/serial.rs @@ -3,7 +3,7 @@ use std::{ ops::Deref, sync::Arc, thread::{self, JoinHandle}, - time::{Duration, Instant}, + time::Duration, }; use crossbeam_channel::{unbounded, Receiver, RecvTimeoutError, Sender}; @@ -67,9 +67,13 @@ impl SerialManager { let mut buf = vec![0; n]; // implement a read exact to allow better error messages let mut filled = 0; - let timeout = Instant::now() + port.read_timeout; while filled < n { - match port.reader_ch.as_ref().unwrap().recv_deadline(timeout) { + match port + .reader_ch + .as_ref() + .unwrap() + .recv_timeout(port.read_timeout) + { Ok(b) => { buf[filled] = b; filled += 1; @@ -125,7 +129,8 @@ impl SerialQueue { let ser = Arc::clone(&serial); handles.push(thread::spawn(move || { while let Ok(data) = wrx.recv() { - ser.lock().as_mut().unwrap().write_all(&data).unwrap(); + data.chunks(256) + .for_each(|chunk| ser.lock().as_mut().unwrap().write_all(chunk).unwrap()); } })); @@ -133,7 +138,7 @@ impl SerialQueue { let (rtx, rrx) = unbounded::<u8>(); let ser = Arc::clone(&serial); handles.push(thread::spawn(move || { - let mut buf = [0; 1024]; + let mut buf = [0; 256]; loop { match ser.lock().as_mut().map(|p| p.read(&mut buf)) { Some(Ok(n)) => { -- GitLab