[英]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()
function 的返回值為 0 但我預計會寫入 9 個字節。 使用sudo
我寫了 9 個字節,但緩沖區保持[0, 0, 0, 0, 0, 0, 0, 0, 0]
。
這使用了rppal板條箱。 我對serial或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
以四種(非)阻塞模式之一運行,具體取決於set_read_mode
配置的設置。 默認情況下,read
配置為非阻塞。
這同樣適用於Uart::write
/ set_write_mode
。
非阻塞意味着如果沒有可用數據,調用將立即返回該時刻可用的任何數據。 與計算機的 rest 相比,串行協議通常非常慢,因此這是很常見的情況。
您將需要調整您的代碼來處理這個問題。 一個簡單的解決方案是使用set_read_mode
/ set_write_mode
使調用阻塞。
另一種(更好的?)解決方案可能涉及延遲重試read
和write
調用,直到緩沖區足夠滿。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.