为什么使用 rppal 的 Uart 读取 Raspberry Pi 上的软件串行端口不会更改缓冲区?

Why does using rppal's Uart to read a software-serial port on the Raspberry Pi not change the buffer?

我正在尝试从 Raspberry Pi 上的软件串行端口 (ttySOFT0) 读取传感器。我正在使用 soft_uart 获取我的串行接口。

密码是:

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("Could not write to the serial port");
port.read(&mut buffer)
    .expect("Could not read from the serial port");
let mhz19_high = buffer[2] as u32;
let mhz19_low = buffer[3] as u32;
let reading = mhz19_high * 256u32 + mhz19_low;
println!("{:?}", buffer);

port.write()函数的return值为0,但我希望写入9个字节。使用 sudo 我写了 9 个字节,但缓冲区保持 [0, 0, 0, 0, 0, 0, 0, 0, 0].

这也使用 rppal crate. I hadn't any luck with the serial or serial2 个板条箱。

.expect(...) 没有错误。我确信 soft_uart 驱动程序没有问题,因为它与 Python:

中的 sudo 一起使用
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]

Uart::read 的文档指出(强调我的):

read operates in one of four (non)blocking modes, depending on the settings configured by set_read_mode. By default, read is configured as non-blocking.

同样适用于Uart::write / set_write_mode.

非阻塞意味着如果没有可用数据,调用将 return 立即使用当时可用的任何数据。与计算机的其他部分相比,串行协议通常非常慢,所以这是很常见的事情。

您将需要调整您的代码来处理这个问题。一个简单的解决方案是使用 set_read_mode / set_write_mode 来阻塞调用。

另一个(更好的?)解决方案可能涉及延迟重试 readwrite 调用,直到缓冲区足够满。