我需要编写一个程序来对 FreeBSD 10.3 机器上串行端口中调制解调器控制线的变化做出反应。我不想从中读取任何数据(不会有任何数据)。我知道我可以配置端口以在发生这种情况时引发(在我的实例中)IRQ4,但是我的程序如何接收中断?我是否必须在中断描述符表中安装函数指针?如果需要,如何安装?或者有什么更简单的东西我可以利用吗?
由于缺乏代表,我无法在这里对 plonk 的有用答案发表评论:查看(监控)串行端口的线路状态
不久前,当我为我的铣床制作数字读数时,我在 MS-DOS 中对并行端口做了类似的事情,但据我记得那是在实模式下并连接到 IVT,我怀疑这会很简单通过对比。
(说明:我继承了一个工作但简单的 UPS,它缺少通信端口。我想我可以通过电气隔离/电平转换到我的服务器串行端口中的控制线来“读取”面板 LED 和蜂鸣器。基本上,如果有任何关于机器的信息,我知道,UPS 与常规情况不同,将启动一个关闭脚本,但如果我能相当快地设置它,那么我可以节省 100 英镑购买新的脚本。)
答案1
因为它是一个 UPS,我想你可以负担得起每 10 秒左右轮询一次调制解调器信号(来自 freebsd终端(4)):
int state;
if(ioctl(fd, TIOCMGET, &state)...)
if(state & TIOCM_DTR)...
然而,如果您希望立即收到一个调制解调器信号(即 DCD)变化的通知,您可以将 tty 标志设置为清除CLOCAL
(请参阅特米奥斯),然后
open()
端口将挂起,直到调制解调器信号 DCD 处于活动状态。当您丢失 DCD 时,您还会收到 SIGHUP。
另一种机制是将其中一条线路连接到输入 RX 数据引脚。如果您将这个值拉高超过您设置的速度的适当字符时间,则会产生帧错误。如果设置 IGNBRK=0 和 BRKINT=0,则驱动程序将\0
在输入队列上放置一个空字节read()
,如果处于原始模式,该空字节可以解除对挂起的阻塞。