串口设备

每个串口有两个设备,一个 tty 设备 (例如,ttyS0) 和一个呼叫设备 (例如,cua0)。 历史上,tty 设备用于接收连接,而呼叫设备用于发送连接。 因此,如果相关的 tty 设备已经打开,则任何尝试打开呼叫设备的尝试都会失败。 虽然这种行为仍然存在,但很多人更喜欢使用 tty 设备进行所有连接。 当担心两个程序可能同时访问该设备而相互干扰时,会使用锁文件。 因此,要使用 /dev/ttyS0,您需要创建一个文件 /var/lock/LOCK..ttyS0,其中包含使用该设备的程序的进程 ID;当然,除非该文件已经存在,在这种情况下,您需要等待使用该设备的程序删除锁文件。 许多通信程序已经设计为使用锁文件。

关于这个工作方式存在一些争议,所以我做了一些更深入的研究,并在 Linux PPP HOWTO 中发现了以下内容

9.2 串口名称:历史上,Linux 使用 cuaX 设备进行拨出,ttySx 设备用于拨入。 内核代码中需要这种区分的部分在内核版本 2.0.x 中已经更改,现在你应该使用 ttySx 进行拨入和拨出。 我了解到 cuaX 设备名称很可能会在未来的内核版本中消失。

但是,我在内核源代码(2.0.29 和 2.1.84)中进行了一些查找,结果发现 HOWTO 文档有点误导。 如果你打开了该设备的 tty 版本,任何尝试打开呼叫版本的尝试都会导致 EBUSY 错误。 我验证了这一点,确实如此。 因此,似乎可以使用 tty 设备进行传入呼叫,而使用呼叫设备进行传出呼叫,只要您也使用锁文件或者每次只尝试一次传出呼叫,就可以完美地工作。

我尝试设置我的机器,以便使用两个单独的设备接听和拨打电话,我发现 getty 必须打开 tty 设备才能监听传入的呼叫,因此尝试在呼叫设备上进行传出呼叫失败 (EBUSY)。 似乎这是一个有趣的问题,但超出了本文的范围。

因此,对于大多数人来说,使用哪个设备并不重要,只要它们保持一致,并且如果同时多次尝试使用该设备,则使用锁文件即可。 但是,理解呼叫设备和 tty 设备之间的细微差别可能是有用的。

锁文件协议记录在 FHS 中:http://www.pathname.com/fhs/2.0/fhs-5.5.html

此外,我在一个列表存档中找到了另一个关于这两个设备之间差异的讨论:http://www.uwsg.indiana.edu/hypermail/linux/kernel/9607.0/0363.html。 此讨论表明呼叫设备仅用于历史兼容性,现在所有内容都应使用带有锁文件的 tty 设备。

© . All rights reserved.