Skip to content

Commit 6dad001

Browse files
committed
Don't read char by char and instead read into a buffer in chunks
1 parent 6297702 commit 6dad001

File tree

2 files changed

+22
-16
lines changed

2 files changed

+22
-16
lines changed

src/main.rs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -49,25 +49,27 @@ fn main() {
4949
.expect("Error writing to serial");
5050

5151
let mut serial_buf: Vec<u8> = Vec::with_capacity(5000);
52-
let mut serial_char_buf: Vec<u8> = vec![0; 1];
52+
let mut read_buf = [0u8; 256];
5353
let poll_data: Arc<Mutex<Vec<PollData>>> = Arc::new(Mutex::new(vec![]));
5454

5555
debug!("Receiving data on serial connection.");
5656
loop {
57+
// read data from serial port in chunks until null terminator
5758
loop {
58-
if let Err(e) = port.read_exact(&mut serial_char_buf) {
59-
match e.kind() {
60-
io::ErrorKind::TimedOut | io::ErrorKind::UnexpectedEof => continue,
61-
_ => panic!("IO error when reading character: {e}"),
59+
match port.read(&mut read_buf) {
60+
Ok(n) => {
61+
let data = &read_buf[..n];
62+
// if the chunk contains a null byte take up to it and break, otherwise - accumulate
63+
if let Some(pos) = data.iter().position(|&b| b == 0x00) {
64+
serial_buf.extend_from_slice(&data[..pos]);
65+
break;
66+
}
67+
serial_buf.extend_from_slice(data);
6268
}
63-
}
64-
65-
match serial_char_buf.first() {
66-
Some(i) => match i {
67-
0x00 => break,
68-
c => serial_buf.push(*c),
69-
},
70-
None => panic!("IO error when trying to read serial buffer"),
69+
Err(e)
70+
if e.kind() == io::ErrorKind::TimedOut
71+
|| e.kind() == io::ErrorKind::UnexpectedEof => {}
72+
Err(e) => panic!("IO error when reading buffer: {e}"),
7173
}
7274
}
7375

@@ -77,8 +79,10 @@ fn main() {
7779
.expect("Error writing to serial");
7880
}
7981
Err(e) => {
80-
port.write_all(format!("{}\nERR\0", BASE64.encode(e.as_bytes())).as_bytes())
81-
.expect("Error writing to serial");
82+
port.write_all(
83+
format!("{}\nERR\0", BASE64.encode(e.as_bytes())).as_bytes(),
84+
)
85+
.expect("Error writing to serial");
8286
}
8387
}
8488
serial_buf.clear();

src/signal.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ use phf::phf_map;
55
/// Returns Ok if the signal was sent, or an Err if the signal could not be sent.
66
pub fn send(pid: &&str, signal: &&str) -> Result<String, String> {
77
let signal_str = SIGNALS.get(signal).expect("Malformed signal number");
8-
let sig = signal_str.parse::<signal::Signal>().expect("Malformed signal name");
8+
let sig = signal_str
9+
.parse::<signal::Signal>()
10+
.expect("Malformed signal name");
911

1012
match signal::kill(
1113
nix::unistd::Pid::from_raw(pid.parse::<i32>().expect("Malformed pid")),

0 commit comments

Comments
 (0)