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