improve serial impl

This commit is contained in:
Robin Mueller
2025-11-04 15:24:13 +01:00
parent f6aedfcab4
commit 00dc99d697

View File

@@ -60,18 +60,29 @@ impl PacketTransportSerialCobs {
pub fn receive<F: FnMut(&[u8])>(&mut self, mut f: F) -> Result<usize, super::ReceiveError> {
let mut decoded_packets = 0;
loop {
let read_bytes = self.serial.read(&mut self.reception_buffer)?;
if read_bytes == 0 {
break;
}
for byte in self.reception_buffer[..read_bytes].iter() {
match self.decoder.feed(*byte) {
Ok(Some(packet_len)) => {
f(&self.decoder.dest()[0..packet_len]);
decoded_packets += 1;
match self.serial.read(&mut self.reception_buffer) {
Ok(read_bytes) => {
if read_bytes == 0 {
break;
}
Ok(None) => (),
Err(e) => self.error_handler(e),
for byte in self.reception_buffer[..read_bytes].iter() {
match self.decoder.feed(*byte) {
Ok(Some(packet_len)) => {
f(&self.decoder.dest()[0..packet_len]);
decoded_packets += 1;
}
Ok(None) => (),
Err(e) => self.error_handler(e),
}
}
}
Err(e) => {
if e.kind() == std::io::ErrorKind::TimedOut
|| e.kind() == std::io::ErrorKind::WouldBlock
{
break;
}
return Err(super::ReceiveError::Io(e));
}
}
}