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é el uso del puerto UART de rppal para leer un puerto serie de software en la Raspberry Pi no cambia el búfer?

Estoy intentando leer un sensor a través de un puerto serie de software (ttySOFT0) en Raspberry Pi. Estoy usando soft_uart para obtener mi interfaz serial.

El código es:

rust
let mut port = Uart::with_path("/dev/ttySOFT0", 9_600, Parity::None, 8, 1).unwrap();
let mut buffer = [0u8; 9];
let command = [0xFFu8, 0x01u8, 0x86u8, 0, 0, 0, 0, 0, 0x79u8];
port.write(&command)
.expect("No se pudo escribir en el puerto serie");
port.read(&mut buffer)
.expect("No se pudo leer del puerto serie");
let mhz19_high = buffer[2] as u32;
let mhz19_low = buffer[3] as u32;
let reading = mhz19_high * 256u32 + mhz19_low;
println!("{:?}", buffer);

El valor de retorno de la función port.write() es 0 pero esperaba escribir 9 bytes. Con sudo escribo 9 bytes, pero el búfer queda [0, 0, 0, 0, 0, 0, 0, 0, 0].

Esto usa la librería rppal. No tuve suerte con las librerías serial o serial2 tampoco.

No hay errores en el .expect(...). Estoy seguro de que no hay un problema con el controlador soft_uart ya que funciona con sudo en Python:

python
ser = serial.Serial('/dev/ttySOFT0')
packet = bytearray()
packet.append(0xFF)
packet.append(0x01)
packet.append(0x86)
packet.append(0x00)
packet.append(0x00)
packet.append(0x00)
packet.append(0x00)
packet.append(0x00)
packet.append(0x79)
ser.write(packet)
res = ser.read(9)
reading_co2 = res[2]*256+res[3]

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que la función port.write() no está escribiendo todos los 9 bytes al puerto serial de software (ttySOFT0) en la Raspberry Pi al utilizar la librería soft_uart en Rust sin sudo. Sin embargo, al utilizar sudo en Python, el código escribe exitosamente los 9 bytes al puerto.

    Una posible solución podría ser probar con una biblioteca diferente para la comunicación serial en Rust, como serialport o posix-serial. Alternativamente, correr el código de Rust con privilegios de sudo también podría funcionar. También es importante revisar que los permisos y configuraciones correctos estén en su lugar para el puerto ttySOFT0.

Comments are closed.