概括
- 我已经在 Raspberry Pi 5 上安装了 Ubuntu 23.10。
- 我已经升级了所有内容。
- 我正在尝试使用 UART 与各种设备通信。
- 例如,我可以看到设备
/dev/ttyAMA2
。 - 我有一个定期传输数据的 GPS。
- 我从未从它收到任何数据。
- 完全相同的设置适用于最新的 Raspberry Pi OS。(我在那里遇到了 Ubuntu 没有的其他问题。)
细节与研究
我在这里和其他论坛上找到了各种帖子。鉴于此,我做了以下事情:
- 将我自己添加到
dialout
和tty
群组:
sudo usermod -a -G dialout $USER
sudo usermod -a -G tty $USER
- 编辑
/boot/firmware/config.txt
[all]
# Enable the audio output, I2C and SPI interfaces on the GPIO header. As these
# parameters related to the base device-tree they must appear *before* any
# other dtoverlay= specification
dtparam=audio=on
dtparam=i2c_arm=on
dtparam=spi=on
dtoverlay=uart2-pi5 # New line.
enable_uart=1 # New line.
值得注意的是,这根本不起作用。它甚至不会创建/dev/ttyAMA2
:
dtoverlay=uart2-pi5,ctsrts
这些行似乎没有什么区别:
dtoverlay=disable-bt
dtoverlay=disable-bt-pi5
这是我的/boot/firmware/cmdline.txt
zswap.enabled=1 zswap.zpool=z3fold zswap.compressor=zstd multipath=off dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 rootwait fixrtc quiet splash
我尝试过
我有一个程序,其功耗/dev/ttyAMA2
为 38400 波特(这是 GPS 的默认设置)。该程序是用 Rust 编写的:
let port = serialport::new(&device, 38400)
.timeout(Duration::from_millis(2000)) // Timeout defined here.
.open()
.expect("Failed to open port");
let mut port = BufReader::new(port);
let mut parser = NmeaParser::new();
let mut buf = String::with_capacity(10240);
loop {
let size = match port.read_line(&mut buf) {
Ok(n) => n,
Err(reason) => {
// It fails here.
// failed to read reason=Custom { kind: TimedOut, error: "Operation timed out" }
warn!(?reason, "failed to read");
continue;
}
};
// ...
为了简单起见,这可以用 完全重现minicom
。
在 RPi OS 上
这很好用:
minicom -D /dev/ttyAMA2 --baudrate 38400
我马上就看到了 GPS 数据。
在 Ubuntu 上
Minicom 启动正常。
minicom -D /dev/ttyAMA2 --baudrate 38400
但是,我从未收到任何数据。
我究竟做错了什么?