es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué no puedo recibir datos seriales utilizando Rust?

He estado intentando leer datos seriales de una Feather M0, pero por alguna razón no puedo leer los datos en un buffer. Este dispositivo está definitivamente emitiendo datos seriales, y tanto PlatformIO como el IDE de Arduino muestran datos seriales en sus monitores respectivos. Sin embargo, siempre se agota el tiempo de espera cuando lo estoy leyendo en Rust, sin importar el valor de tiempo de espera que haya configurado. Aquí está mi código:

// Primero, encuentra el puerto serie
let port_info = find_receiver();

// Si no encontramos un puerto, entonces no podemos continuar
if port_info.is_none() {
    panic!("No se pudo encontrar un puerto serial");
}

let mut port = serialport::new(port_info.unwrap().port_name, 9600)
    .timeout(Duration::from_millis(1000))
    .open()
    .expect("No se pudo abrir el puerto serial");

let mut serial_buf: Vec<u8> = vec![0; 8];
loop {
    let n = port.read_exact(serial_buf.as_mut_slice()).unwrap();

    println!("El buffer es {:?}", serial_buf);
}

La función find_receiver() simplemente escanea los puertos abiertos y devuelve el que quiero conectar. Estoy en Windows, por lo que en este caso suele ser COM9 o COM12. Me gustaría que esta fuera una aplicación multiplataforma, por lo que no estoy utilizando la función open_native() que proporciona serialport.

He intentado variar el tamaño del buffer desde 1 byte hasta 1000, he intentado diferentes versiones de read en el puerto, he intentado omitir los errores de tiempo de espera y he intentado imprimir directamente los bytes leídos en io::Stdout. ¿Algún idea de qué hacer?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que puede haber un problema con la forma en que se lee los datos seriales en Rust. Aquí hay algunas cosas que podrías intentar:

    1. Aumenta la duración del tiempo de espera: el tiempo de espera actual está configurado en 1 segundo, pero si los datos que emite el dispositivo tardan más que eso, podría estar causando el problema de tiempo de espera. Intenta aumentar el tiempo de espera a un valor más grande y ve si eso ayuda.

    2. Verifica la configuración del puerto: asegúrate de que la configuración del puerto en Rust coincida con la configuración utilizada en PlatformIO y el entorno de desarrollo Arduino. Esto incluye cosas como la velocidad de baudios, bits de parada y paridad.

    3. Intenta usar una biblioteca diferente: si el problema persiste, puede valer la pena probar una biblioteca de Rust diferente para leer datos seriales. Algunas opciones populares incluyen serial-rs y tokio-serial.

    4. Verifica el formato de los datos seriales: dependiendo del formato de datos que emita el dispositivo, tal vez sea necesario convertirlos antes de leerlos en Rust. Asegúrate de que el formato de datos coincida con lo que Rust espera.

    5. Depura los datos que se reciben: intenta imprimir los datos que se reciben del dispositivo para ver si hay algún problema con el formato o contenido de los datos seriales. Esto podría ayudar a identificar la fuente del problema.

Comments are closed.