UART 无法在搭载 23.10 的 Raspberry Pi 5 上运行

UART 无法在搭载 23.10 的 Raspberry Pi 5 上运行

概括

  • 我已经在 Raspberry Pi 5 上安装了 Ubuntu 23.10。
  • 我已经升级了所有内容。
  • 我正在尝试使用 UART 与各种设备通信。
  • 例如,我可以看到设备/dev/ttyAMA2
  • 我有一个定期传输数据的 GPS。
  • 我从未从它收到任何数据。
  • 完全相同的设置适用于最新的 Raspberry Pi OS。(我在那里遇到了 Ubuntu 没有的其他问题。)

细节与研究

我在这里和其他论坛上找到了各种帖子。鉴于此,我做了以下事情:

  1. 将我自己添加到dialouttty群组:
sudo usermod -a -G dialout $USER
sudo usermod -a -G tty $USER
  1. 编辑/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

但是,我从未收到任何数据。


我究竟做错了什么?

相关内容