如何在 raspberry pi 上找到 USB 调制解调器的 tty?

How to find tty of USB modem on raspberry pi?

我想向连接到 raspberry pi 的 USB 调制解调器发送 AT 命令。我发现一些帮助提到 USB 调制解调器通常作为 ttyACM 或 ttyUSB 设备连接,但我没有 ttyACM 或 ttyUSB 设备。我有tty1到tty63的设备,但我不知道如何识别调制解调器使用的是哪一个。

我尝试通过在未连接调制解调器的情况下存储设备列表来查找设备,然后在插入调制解调器后比较设备列表:

ls /dev/ > dev_list_1.txt
(plug the modem in)
ls /dev/ | diff --suppress-common-lines -y - dev_list_.txt

returns 对我来说:

bsg                               <
sda                               <
sg0 

我试过用cu工具连接调制解调器:

sudo cu -l sda
sudo cu -l sg0

但两者都是 returns:

cu: open (/dev/sg0): Permission denied
cu: sg0: Line in use

所以我也尝试使用 minicom 并将串行通信配置为 /dev/sg0 或 /dev/sda 但它也不起作用。

所以我想我需要找到调制解调器使用的正确 tty 设备才能与其通信。但是怎么找呢?

您可以查找 /sys/class/tty/*/device 条目并忽略所有指向 serial8250 的链接,因为它们不是 USB 设备。

使用 shell 脚本:

for device in /sys/class/tty/*/device
do
    case $(readlink $device) in
        *serial8250)    # e.g. ../../../serial8250
            ;;
        *)              # e.g. ../../../1-3:3.1
            echo $device | rev | cut -d/ -f2 | rev
            ;;
    esac;
done | sed 's@^@/dev/@'

产生

/dev/ttyACM0
/dev/ttyACM1
/dev/ttyS0

与我的 phone 连接。你可能得到的不仅仅是 usb 设备(例如 ttyS0),但至少这应该给你内核知道的所有 usb 串行设备(如果设备没有填充 /sys/class/tty/ 它几乎肯定不是串行设备).

这是基于libserialport library中的list_ports功能逻辑。