是否有可能知道串口是否在linux中连接/断开?

时间:2012-05-04 15:14:54

标签: linux-device-driver embedded-linux

是否可以在linux pc上查询特定的串口是否已连接/断开?我们有什么方法可以读取sysfs信息来查询特定端口是否连接?

1 个答案:

答案 0 :(得分:13)

这取决于你所说的“连接”。我将首先解决最不准确但最简单的含义。

端口的存在

如果您要查明系统中是否存在端口本身,那么您可以检查是否存在支持它的已加载模块,检查是否存在某个设备,例如/ dev / ttyS0或/ dev / ttyUSB0,验证您是否可以打开它(例如,我有一个/ dev / ttyS0设备文件存在于实际上没有该硬件的系统上)。 USB转换器可以进行热插拔,因此今天您可以看到实际的“串行端口”在正在运行的系统中进出。

“调制解调器”控制/状态信号

另一种可能性是你想知道是否有任何连接到端口的东西。这不是系统必须知道的东西。有一个调制解调器控制和状态信号,外设可以断言,你可以读取。然而,外围设备不需要使用它们,或者甚至以在调制解调器时代曾经有意义的方式使用它们。您可能发现自己连接的许多系统仅使用接收和发送数据线和接地。

通过接收数据进行检测

剩下的可能性是除了从中查找数据之外,可能无法判断端口是否已连接。某些外围设备可能会定期自动生成数据,因此您可以尝试阅读并查看是否有任何数据。对于其他人,您可以发送一个查询(希望不会有一个具有不良副作用的查询),并查看您是否收到了预期的响应。例如,如果您向其发送字符串“* IDN?\ n”,则大致实施SCPI标准的工具可能会回复一些识别信息。

另一个主要问题是您必须为端口和外设配置兼容的波特率和字格式。如果没有,您可能会得到看似随机的数据。在某些情况下,您可以从实现UART引擎中读取帧错误位(您必须检查驱动程序是否公开了这个)并使用它作为可能存在某些内容的指示,但是在错误的波特率下率。

通过对来自另一端的硬件和预期数据的细粒度控制,也可以编写自动波特率检测例程,尽管通常在“外围”端而不是“主机”上实现。