检测串口中断linux

时间:2017-01-11 16:25:53

标签: linux uart

是否有可能检测到串行中断并告诉Linux上哪个串口产生了它?我已经看到了一些从休息时间生成一个sigint的解决方案,但是我需要知道两个串口中的哪一个读取中断,据我所知它可以用sigints完成。

1 个答案:

答案 0 :(得分:1)

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

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

当所有人都连接到带有串行电传终端的多用户主机时,这个termios东西就是古老的UNIX。软件考古学。它不是用于监视串行UART,而是当有人的调制解调器挂断时,对串口没有任何了解的随机UNIX命令会自动退出。 vi可以保存您正在编辑的文件。点击vt102终端上的“BREAK”键将导致当前命令退出。

如果你想使用它,我认为你必须有两个进程,每个进程监视一个串行端口。你会知道哪个端口根据哪个端口获得了信号。您必须将每个进程设置为自己的会话负责人(请参阅setsid())并将串行端口设置为控制tty(请参阅TIOCSCTTYTIOCSPGRP)。

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

我不确定你的应用程序是什么,但是我发现尝试用库存Linux来讨论古老而模糊的RS-232协议是有问题的。比如监视BREAK的串行线路,或者使用字符间的10μs间隙来发信号通知数据包间帧,或者大于8位宽的字符等等,这些都不能正常工作。如果您可以进行内核编程,则可以创建一个自定义行规则,使这些事情成为可能。可能有一个中断(或帧错误或奇偶校验错误)监视线路规则,您需要做的就是从端口上的用户空间调用select(),它将在监视事件发生时发出信号。