检测串行中断 linux

Detect serial break linux

是否可以检测串行中断并告诉它是哪个串行端口在 Linux 上生成的?我见过一些从中断生成信号的解决方案,但我需要知道 2 个串行端口中的哪一个读取中断,据我所知,它不能用信号来完成。

如果串口是前台进程组的控制tty,

BRKINT会发送一个信号。一个会话最多可以 一个 控制 tty。所以我认为您无需担心信号来自哪个端口,因为一开始您无法从多个端口获取信号。

这个 termios 东西是古老的 UNIX,当时每个人都通过串行电传终端连接到 multi-user 大型机。软件考古学。它不是用来监视串行 UART 的,而是当某人的调制解调器挂断时,对串行端口一无所知的随机 UNIX 命令可以自动退出。 vi 可以保存您正在编辑的文件。在 vt102 终端上按下 'BREAK' 键会导致当前命令退出。

如果你想使用这个,我想你必须有两个进程,每个进程监控一个串口。您会根据哪个端口收到信号知道哪个端口中断了。你必须让每个进程都有自己的会话负责人(参见setsid())并将串行端口设置为控制 tty(参见TIOCSCTTYTIOCSPGRP)。

另一种方法是使用TIOCGICOUNT ioctl 连续轮询串口。这将为您提供该端口上中断、帧和奇偶校验错误数的计数器。注意它们的增加。当然,轮询比获取信号效率低得多,这意味着在发现中断之前可能需要您的轮询间隔。

我不确定您的应用程序是什么,但我发现尝试将古老而晦涩的 RS-232 协议与股票 Linux 进行讨论是有问题的。诸如监视一组串行线路的 BREAK,或在字符之间使用 10 μs 的间隙来发出 inter-packet 帧信号,或大于 8 位宽的字符等事情都不能很好地工作。如果您可以进行内核编程,则可以创建自定义行规程,使这些事情成为可能。可能有一个中断(或帧错误或奇偶校验错误)监控线路规则,您所要做的就是从端口上的用户空间调用 select(),它会在监控事件发生时发出信号。