是否可以在Linux上检测到串行中断并判断是哪个串行端口生成的?我见过一些从break生成sigint的解决方案,但我需要知道2个串行端口中的哪一个读取break,据我所知,这是用sigint无法完成的。
BRKINT
将发送信号。一个会话最多可以有一个控制tty。所以我认为你不需要担心信号来自哪个端口,因为你一开始无法从多个端口获得信号。
这种termios
的东西是古老的UNIX,当时每个人都用串行电传终端连接到多用户主机上。软件考古。它并不是用来监视串行UART的,因此,当某人的调制解调器挂断时,对串行端口一无所知的随机UNIX命令可以自动退出。vi
可以保存您正在编辑的文件。在vt102终端上点击"BREAK"键将导致当前命令退出。
如果你想使用这个,我认为你必须有两个进程,每个进程监控一个串行端口。你会根据哪个端口得到信号来知道哪个端口得到了中断。您必须使每个进程都有自己的会话引导器(请参阅setsid()
),并将串行端口设置为控制tty(请参见TIOCSCTTY
和TIOCSPGRP
)。
另一种方法是使用TIOCGICOUNT
ioctl连续轮询串行端口。这将为您提供该端口上的中断、帧和奇偶校验错误数的计数器。请注意它们是否会增加。当然,轮询的效率远低于获得信号,这意味着在发现中断之前,可能需要等待您的轮询间隔。
我不确定你的应用程序是什么,但我发现试图用现有的Linux来谈论古老而晦涩的RS-232协议是有问题的。像监控一组串行线的BREAK,或者使用字符之间的10μs间隙来信号包间成帧,或者大于8位宽的字符等等,都不太好用。如果你可以进行内核编程,你可以创建一个自定义的行规则,使这些事情成为可能。一个可能有一个中断(或帧错误,或奇偶校验错误)监视线路规程,您所要做的就是从端口上的用户空间调用select()
,它将在监视事件发生时发出信号。