为什么使用 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
来阻塞调用。
另一个(更好的?)解决方案可能涉及延迟重试 read
和 write
调用,直到缓冲区足够满。
我正在尝试从 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:
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 byset_read_mode
. By default,read
is configured as non-blocking.
同样适用于Uart::write
/ set_write_mode
.
非阻塞意味着如果没有可用数据,调用将 return 立即使用当时可用的任何数据。与计算机的其他部分相比,串行协议通常非常慢,所以这是很常见的事情。
您将需要调整您的代码来处理这个问题。一个简单的解决方案是使用 set_read_mode
/ set_write_mode
来阻塞调用。
另一个(更好的?)解决方案可能涉及延迟重试 read
和 write
调用,直到缓冲区足够满。