可以使用9针串行端口作为;GPIO“;使用ioctl()?

可以使用9针串行端口作为;GPIO“;使用ioctl()?,c,linux,ioctl,C,Linux,Ioctl,是否可以使用linux设备上的COM端口读取交换机的值?我认为使用ioctl()应该是可能的,但我一直在努力寻找一个类似的例子。我只需要一个输入,并且只需要读取高/低值。我想我可以使用ioctl将其中一个管脚设置为高,然后在该管脚和另一个管脚之间连接一个开关,再次使用ioctl读取第二个管脚()的值 其基本原理是,我有一个可靠的旧服务器在车库中运行,我想做一些东西,它会发出哔哔声,告诉车库门是否打开,因为服务器就在门旁边,我想只需将一个交换机连接到com端口(目前未使用)的背面就可以了 诚然,我

是否可以使用linux设备上的COM端口读取交换机的值?我认为使用ioctl()应该是可能的,但我一直在努力寻找一个类似的例子。我只需要一个输入,并且只需要读取高/低值。我想我可以使用ioctl将其中一个管脚设置为高,然后在该管脚和另一个管脚之间连接一个开关,再次使用ioctl读取第二个管脚()的值

其基本原理是,我有一个可靠的旧服务器在车库中运行,我想做一些东西,它会发出哔哔声,告诉车库门是否打开,因为服务器就在门旁边,我想只需将一个交换机连接到com端口(目前未使用)的背面就可以了


诚然,我可以花上几英镑,省得自己头疼,还可以使用arduino或ESP8266,但现在这让我感到好奇

是的,你当然能做到。串行端口上有许多行可以用作GPIO。其中一个(我想是在pin9上)是RING,它在旧的串行模式下用来发出来电信号

你可以这样读:

unsigned mask = TIOCM_RNG;
unsigned status;
int fd; // your serial port file descriptor.

/* Get current status of the control lines in mask */
if (ioctl(fd, TIOCMGET, &status) == -1) {
    perror("ioctl(TIOCMGET)");
}

/* now evaluate status */
您还需要生成一个可以应用于环形线路的电压。一种廉价的方法是传输一些交替比特流。例如,以任何波特率发送0x55

然后可以从TX引脚分接电压。使用两个二极管分离正负电压,并使用两个电容器缓冲它们。这将为您提供与环形线路兼容的正负电压

这是一个应该有效的示意图。根据口味调整二极管和电容器,但不要疯狂使用电容器。10µF应为最大值


喜欢你的实际应用,+1…这个问题似乎离题了,因为它是关于“我想知道是否”,而不是一个特定的编程问题。我稍微重写了一下,我确实有一个真正的编程问题注意RS-232串行端口上的逻辑电平是+ve/-ve,而不是0/+ve。使用现成的USB GPIO I/F可能会更好。使用并行端口进行此类操作曾经非常常见。我想,当计算机仍然有这些功能时……谢谢,这看起来很有希望,我会在第二天左右尝试一下,如果它能工作,我会接受答案,同时我已经投票赞成大多数串行端口会将低于1V的任何东西视为低电压,如果电缆短,就不需要负电压。