¿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]
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íasoft_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
oposix-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 puertottySOFT0
.