是否可以在 linux pc 上查询特定的串口连接/断开连接?有什么方法可以读取 sysfs 信息来查询特定端口是否已连接?
1 回答
这取决于您所说的“连接”是什么意思。我将首先解决最不准确但最简单的含义。
港口的存在
如果您的意思是确定端口本身是否存在于系统中,那么您可以检查是否存在支持它的已加载模块,检查是否存在诸如 /dev/ttyS0 或 /dev/ttyUSB0 之类的设备,并验证您是否可以打开它(例如,我在实际上没有该硬件的系统上存在一个 /dev/ttyS0 设备文件)。USB 转换器可以热插拔,因此今天您可以看到实际的“串行端口”在正在运行的系统中来来去去。
“调制解调器”控制/状态信号
另一种可能性是您想知道是否有任何东西连接到端口。这不是系统必须知道的。有调制解调器控制和状态信号,外围设备可以断言,并且您可以读取它们。但是,外围设备不需要使用它们,甚至不需要以在调制解调器时代曾经有意义的方式使用它们。您可能会发现自己连接的许多系统仅使用接收和发送数据线和接地。
通过接收数据检测
剩下的可能性是,除了从中查找数据外,可能无法判断端口是否已连接。一些外围设备可能会定期自动生成数据,因此您可以尝试阅读并查看是否有任何数据。对于其他人,您可以发送一个查询(希望不是具有不良副作用的查询),看看您是否得到预期的响应。例如,如果您向其发送字符串“*IDN?\n”,近似实现 SCPI 标准的仪器可能会响应一些识别信息。
另一个主要问题是您必须将端口和外围设备配置为兼容的波特率和字格式。如果没有,您可能会得到看似随机的数据。在某些情况下,您可能能够从实现的 UART 引擎中读取帧错误位(您必须检查驱动程序是否公开了它)并将其用作可能存在某些东西的指示,但波特率错误速度。
通过对硬件和来自另一端的预期数据的细粒度控制,也可以编写一个自动波特率检测例程,尽管这通常在“外围”端而不是“主机”上实现。