Буферизация последовательного вывода и синтаксический анализ JSON - PullRequest
1 голос
/ 29 мая 2020

Я новичок в ржавчине и борюсь с проблемой. Я хочу прочитать вывод из последовательного порта и преобразовать его в JSON.

Ниже приведен раздел кода, который читается в последовательном выводе.

match serialport::open(&port_name) {
    Ok(mut port) => {
        let mut serial_buf: Vec<u8> = vec![0; 1000];
        loop {
            match port.read(serial_buf.as_mut_slice()) {
                Ok(t) => handle_event(&serial_buf[..t]),
                Err(ref e) if e.kind() == io::ErrorKind::TimedOut => (),
                Err(e) => print!("Port read error: {}\n", e), 
            };
        }
    }
    Err(e) => {
        println!("Failed to open \"{}\". Error: {}", port_name, e);
        ::std::process::exit(1);
    }
};

Затем этот вывод передается в серде для анализа. Однако вывод, который он получает, не всегда является полной строкой JSON, поэтому serde прерывается. Я считаю, что мне нужно буферизовать ответ здесь, но изо всех сил пытаюсь уместить это.

fn handle_event(buf: &[u8]) {
    let e_str = match str::from_utf8(buf) {
        Ok(v) => v,
        Err(e) => { print!("Str conversion error: {}\n", e); return; }, 
    };

    let e = match serde_json::from_str::<Event>(e_str) {
        Ok(e) => e,
        Err(e) => { print!("JSON parse error: {}\n", e); return; },
    };

    print!("{}", e.name);
}

Заранее спасибо за любую помощь.

...