簡體   English   中英

為什么使用 rppal 的 Uart 讀取樹莓派上的軟件串口不會改變緩沖區?

[英]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板條箱。 我對serialserial2板條箱也沒有任何運氣。

.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使調用阻塞。

另一種(更好的?)解決方案可能涉及延遲重試readwrite調用,直到緩沖區足夠滿。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM