<p>你考虑过使用串行设备而不是并行端口吗?因为你有一个TTL信号,你可能需要一个电平转换器将TTL转换成RS232+/-12V电平。一旦使用串行设备,就可以使用标准串行<code>ioctl()</code>调用来检测控制信号状态的变化。在</p>
<p>具体地说,您可以使用所连接的串行设备上的<code>TIOCMIWAIT</code>ioctl来等待对DCD线路的更改,该线路将连接到您的时钟源。在</p>
<p>您的用户空间应用程序将被阻止在<code>TIOCMIWAIT</code>ioctl系统调用中等待,直到时钟线上的状态发生变化,此时您的应用程序将变为可运行并从ioctl返回。您可能需要注意确保您处理的情况下,您的串行控制信号的上升沿和下降沿都发生了状态更改中断。在一些UART硬件(例如tl16c554uart)上,您可能只会得到一个信号在单一方向转换的中断。例如,对于TL16C554A,<code>TIOCMIWAIT</code>只会在任何一个环的上升沿上落下,表示信号改变。在</p>
<p>以这种方式使用串行ioctl还有一个优点:如果需要,可以使用支持<code>TIOCMIWAIT</code>的USB串行加密狗(例如PL2303),并且仍然保持用户级软件兼容性,尽管代价是由于USB而增加了延迟。在</p>
<p>如果您需要比通过用户空间实现的延迟更低的延迟,那么最好编写一个内核驱动程序模块来处理计时和采样,但除非绝对需要,否则我不建议使用这种方法。更容易开发用户的代码。在</p>
<p>下面是一些不完整的示例C代码片段,用于使用<code>TIOCMIWAIT</code>ioctl。在</p>
<pre><code>int serial_fd = open(cmdline.device_name, O_RDWR | O_NONBLOCK | O_NOCTTY);
static const unsigned int ri_flag = TIOCM_RNG;
/* Set up serial port here using tcsetattr. Set CRTSCTS | CLOCAL to ensure status interrupts
* are generated.
*/
while (1) {
/* Wait for positive RI transition. TIOCMIWAIT takes a mask
* as argument, only returning when the appropriate signal has changed.
*/
if (ioctl(serial_fd, TIOCMIWAIT, ri_flag)) {
fprintf(stderr, "ioctl() failed waiting for RI edge [%s]\n", strerror(errno));
break;
}
/* Do sensor sampling here. You could use TIOCMGET to first verify that
* the clock line is in the expected state, eg high, before continuing.
*/
}
</code></pre>