如何在 Linux 上找到所有串行设备(ttyS、ttyUSB、..)而不打开它们?

2023-12-05

获取 Linux 系统上所有可用串行端口/设备列表的正确方法是什么?

换句话说,当我迭代所有设备时/dev/,如何用经典的方式判断哪些是串口,即通常支持波特率和RTS/CTS流量控制?

该解决方案将用 C 进行编码。

我问是因为我使用的第三方库显然是错误的:它似乎只迭代/dev/ttyS*。问题是,例如,存在 USB 串行端口(由 USB-RS232 适配器提供),并且这些端口列在 /dev/ttyUSB* 下。并阅读Linux.org 上的串行 HOWTO,我认为随着时间的推移,还会有其他名称空间。

所以我需要找到检测串口设备的官方方法。问题是似乎没有任何记录,或者我找不到它。

我想一种方法是打开所有文件/dev/tty*并调用特定的ioctl()在它们上,仅在串行设备上可用。但这是一个好的解决方案吗?

Update

赫里卡兹建议查看“setserial”的来源。 它的代码完全符合我的想法:

首先,它打开一个设备:

fd = open (path, O_RDWR | O_NONBLOCK)

然后它调用:

ioctl (fd, TIOCGSERIAL, &serinfo)

如果该调用没有返回错误,那么显然它是一个串行设备。

我在中找到了类似的代码串行编程/termios,建议还添加O_NOCTTY option.

但这种方法有一个问题:

当我在 BSD Unix(即 Mac OS X)上测试这段代码时,它也能正常工作。However,通过蓝牙提供的串行设备会导致系统(驱动程序)尝试连接到蓝牙设备,这需要一段时间才能返回并出现超时错误。这是由于刚刚打开设备造成的。我可以想象类似的事情也可能发生在 Linux 上 - 理想情况下,我不需要打开设备来确定其类型。我想知道是否还有一种方法可以调用ioctl无需打开即可运行,或者以不会导致建立连接的方式打开设备?

我应该怎么办?


The /sys文件系统应该包含足够的信息来满足您的需求。我的系统(2.6.32-40-generic #87-Ubuntu)建议:

/sys/class/tty

它为您提供系统已知的所有 TTY 设备的描述。一个精简的例子:

# ll /sys/class/tty/ttyUSB*
lrwxrwxrwx 1 root root 0 2012-03-28 20:43 /sys/class/tty/ttyUSB0 -> ../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.0/ttyUSB0/tty/ttyUSB0/
lrwxrwxrwx 1 root root 0 2012-03-28 20:44 /sys/class/tty/ttyUSB1 -> ../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/ttyUSB1/tty/ttyUSB1/

点击以下链接之一:

# ll /sys/class/tty/ttyUSB0/
insgesamt 0
drwxr-xr-x 3 root root    0 2012-03-28 20:43 ./
drwxr-xr-x 3 root root    0 2012-03-28 20:43 ../
-r--r--r-- 1 root root 4096 2012-03-28 20:49 dev
lrwxrwxrwx 1 root root    0 2012-03-28 20:43 device -> ../../../ttyUSB0/
drwxr-xr-x 2 root root    0 2012-03-28 20:49 power/
lrwxrwxrwx 1 root root    0 2012-03-28 20:43 subsystem -> ../../../../../../../../../../class/tty/
-rw-r--r-- 1 root root 4096 2012-03-28 20:43 uevent

这里的dev文件包含以下信息:

# cat /sys/class/tty/ttyUSB0/dev
188:0

这是主要/次要节点。这些都可以在/dev获取用户友好名称的目录:

# ll -R /dev |grep "188, *0"
crw-rw----   1 root dialout 188,   0 2012-03-28 20:44 ttyUSB0

The /sys/class/ttydir 包含所有 TTY 设备,但您可能希望排除那些讨厌的虚拟终端和伪终端。我建议你只检查那些有device/driver entry:

# ll /sys/class/tty/*/device/driver
lrwxrwxrwx 1 root root 0 2012-03-28 19:07 /sys/class/tty/ttyS0/device/driver -> ../../../bus/pnp/drivers/serial/
lrwxrwxrwx 1 root root 0 2012-03-28 19:07 /sys/class/tty/ttyS1/device/driver -> ../../../bus/pnp/drivers/serial/
lrwxrwxrwx 1 root root 0 2012-03-28 19:07 /sys/class/tty/ttyS2/device/driver -> ../../../bus/platform/drivers/serial8250/
lrwxrwxrwx 1 root root 0 2012-03-28 19:07 /sys/class/tty/ttyS3/device/driver -> ../../../bus/platform/drivers/serial8250/
lrwxrwxrwx 1 root root 0 2012-03-28 20:43 /sys/class/tty/ttyUSB0/device/driver -> ../../../../../../../../bus/usb-serial/drivers/ftdi_sio/
lrwxrwxrwx 1 root root 0 2012-03-28 21:15 /sys/class/tty/ttyUSB1/device/driver -> ../../../../../../../../bus/usb-serial/drivers/ftdi_sio/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Linux 上找到所有串行设备(ttyS、ttyUSB、..)而不打开它们? 的相关文章

  • 执行“minikube start”命令时出现问题

    malik malik minikube start minikube v1 12 0 on Ubuntu 18 04 Using the docker driver based on existing profile Starting c
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content
  • 从 VBA 访问串行端口的最佳方法是什么?

    从 VBA 访问串行端口的最佳方法是什么 我需要我们的一些销售代表能够通过 PowerPoint 中的操作按钮通过串行端口发送简单的字符串 我不常用 VBA 尤其是像这样的事情 通常我会把它变成某种应用程序 但实际上我认为这个想法并没有那么
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • 研究缓冲区溢出时应该使用哪些版本的 GCC 或标志?

    最近 作为计算机工程专业的本科生 我一直在研究缓冲区溢出 出于兴趣 我开始研究缓冲区溢出 但在尝试在我的计算机上用 GCC 4 9 1 在 Debian Jessie 中 编译的我自己的 C 程序中实现它们时遇到了困难 我听说较新的编译器中
  • [A-Z] 表示 [A-Za-z] 是怎么回事?

    我已经注意到 至少在我使用的一些基于 Unix 的系统上 ls A Z 已经给了我预期的结果ls A Za z 让我无法轻松获得以大写字母开头的该死的文件列表 我刚刚遇到了同样的事情grep 我无法让它停止与小写字母匹配 A Z 直到我最终
  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • 具有多处理功能的 Python 代码无法在 Windows 上运行

    以下简单的绝对初学者代码在 Ubuntu 14 04 Python 2 7 6 和 Cygwin Python 2 7 8 上运行 100 但在 Windows 64 位 Python 2 7 8 上挂起 我使用另一个片段观察到了同样的情况
  • 如何在Linux中自动启动需要X的应用程序

    我试图在系统进入运行级别 5 时自动启动 X 应用程序 这样做的正确方法是什么 我写了一个脚本并将其放在 etc init d 中 我已运行适当的 chkconfig 命令来设置 etc rcX d 目录中的符号链接 一切工作正常 除了当我
  • 从另一个 python 脚本获取返回信息

    我在 Linux 上 我有一个 python 脚本 我想从另一个 python 脚本调用它 我不想将其作为模块导入 为了一层安全性 现在为了学术练习 因为我想弄清楚这一点 我实际上想让一个脚本使用 os system 或另一个类似的函数 并

随机推荐

  • 对非矩形图像区域使用 skimage

    假设我关心的是图像的一部分 我想要计算 GLCM 因为它不是矩形的 我该怎么办 我已经制作了一个屏蔽程序 将我不关心的图像部分归零 我只是不知道如何在不考虑图像的归零部分的情况下获取这个 屏蔽 图像 感谢您的帮助 如果您能够将零强度值分配给
  • 谁能解释为什么 strtotime('cast') 返回一个值?

    这并不是一个真正的问题 尽管它与我们的 if 语句冲突 但是当您输入 strtotime cast 时 它会返回一个默认为今天日期的实际值 我只是想知道是否有人知道cast这个词对于时间函数有什么意义 Thanks 它映射到 澳大利亚 阿德
  • 在 Pyramid 中的视图之间传递表单参数

    我正在创建一个表单 在提交数据之前需要用户确认 我想要一个单独的确认页面 因为我需要显示有关如何处理表单数据的大量信息 我想知道是否有一种Pythonic 方法可以在金字塔中的表单之间传递数据 提交表单会将用户带到确认页面 因此 确认视图的
  • 如何在Asp.net mvc中获取请求处理时间?

    我想记录请求处理时间Asp Net MVC 应用 我可以得到 所用的时间 来自 IIS 日志 但这次包括将响应发送回客户端浏览器所花费的网络时间 我只对 ASP NET 工作进程处理请求所花费的时间感兴趣 我可以选择写一个Http模块但我无
  • 为什么在处理 WMIC 输出并向变量赋值时会输出错误消息“Missing operand”?

    我正在处理一个批处理文件 该文件应该显示当前估计的剩余费用 但是当我运行命令时 我得到了所需的结果以及错误消息Missing operand output My code FOR F delims skip 1 i IN WMIC PATH
  • Dart json.encode 未按照 Firebase 函数的需要进行编码

    我已经研究这个问题有一段时间了 但我似乎无法弄清楚问题到底是什么 在 Dart 2 中json encode 似乎没有给我我想要的结果 我正在传递一个Map
  • Magento通过phtml文件中的锚标记调用cms页面

    我想要这样的东西 a href FaQ s a 意味着单击常见问题解答 创建名为的 cms 页面faqs来自管理面板的将被链接 调用 并显示 或者还有其他办法吗 Thanks 如果您正在 phtml 文件中写入 那么您可以使用 a href
  • CodeIgniter 是否必须在最后一步加载视图?

    我有一个函数 function do something process this gt load gt view some view data exec mv path to folder1 mp3 path to folder2 我的目
  • 如何使用 heat 更改 Wix 生成的目录 ID?

    我正在使用 heat 为多个目录生成 wix 文件 然而 如果目录A和目录B具有相同的文件夹名称 即使绝对路径不同 heat仍然认为是同一个目录 因此生成相同的目录Id 似乎有一种方法可以解决这个问题 那就是使用 directoryid 覆
  • 以自定义语言实现“生成器”支持

    我对语言设计有一点迷恋 目前我正在尝试自己喜欢的语言 http rogeralsing com 2010 04 14 playing with Plastic 真正让我心碎的一件事是 生成器 和 yield 关键字 我知道 C 使用 AST
  • Firestore 安全规则允许用户访问其数据

    我想写一个这样的规则 service cloud firestore match databases database documents match users userId document allow read write if re
  • 在 R 中阅读和理解 XML

    我正在尝试从位于以下位置的网络读取 XML https d396qusza40orc cloudfront net getdata 2Fdata 2Frestaurants xml 我在 R 中收到以下错误 Error XML conten
  • 如何通过城市和国家获取时区?

    在我的 django 项目中 我有一个小型酒店数据库 其中包含字段city and country 我可以得到timezone通过传递到那个地方city and country以某种方式作为参数 我想这样做的原因是因为我有一些基于差异的命令
  • 如何使用 sys.settrace 跟踪在全局范围内运行的代码?

    假设我有一段这样的代码 import sys def printer frame event arg print frame event arg return printer sys settrace printer x 1 sys set
  • Pandas groupby - 一组不同的值

    我有这个数据框 x pd DataFrame from dict cat1 A A A B B C C C cat2 X X Y Y Y Y Z Z cat1 cat2 0 A X 1 A X 2 A Y 3 B Y 4 B Y 5 C Y
  • .Net Core 2.0 未找到视图“索引”

    我将 net core 2 0 应用程序部署到 IIS 并收到以下错误 InvalidOperationException 未找到视图 索引 搜索了以下位置 Views Home Index cshtml Views Shared Inde
  • Python while循环中如何返回值

    当将 return 放入 while 循环时 循环将停止 如何修复它 ser serial Serial port COM5 baudrate 9600 timeout 1 while 1 x str ser readline x re f
  • 在场景之间传递数据 (SpriteKit)

    如何将 SpriteKit 中的信息从一个场景传递到另一个场景 在我的游戏中 我有两个场景 GameScene 和 GameOverScene 分数随着增加而显示在 GameScene 中 但是如何将此信息发送到第二个场景呢 当玩家生命耗尽
  • 如何从来电中获取电话号码?

    Android 中有来电时如何获取电话号码 Make a Broadcast receiver say ServiceReceiver在清单中分配其操作
  • 如何在 Linux 上找到所有串行设备(ttyS、ttyUSB、..)而不打开它们?

    获取 Linux 系统上所有可用串行端口 设备列表的正确方法是什么 换句话说 当我迭代所有设备时 dev 如何用经典的方式判断哪些是串口 即通常支持波特率和RTS CTS流量控制 该解决方案将用 C 进行编码 我问是因为我使用的第三方库显然