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

时间:2015-01-05 22:37:02

标签: c linux ioctl

是否可以使用Linux机箱上的COM端口来读取交换机的值?我认为应该可以使用ioctl(),但我已经努力寻找一个类似的例子。我只需要一个输入,只需要它以高/低值读取。我以为我可以使用ioctl将其中一个引脚设置为高电平,并在该引脚和另一个引脚之间连接一个开关,再次使用ioctl读取第二个引脚的值()

理由是我在车库里有一个值得信赖的旧服务器,我想做一些会发出哔哔声并告诉车库门是否打开的东西,因为服务器就在门旁边,我想只需将一个开关连接到com端口的后面(当前未使用)

即可

当然,我可以花几块钱,让自己头疼并使用arduino或ESP8266,但这让我很好奇!

1 个答案:

答案 0 :(得分:5)

是的,确定你可以这样做。串行端口上有许多行可用作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应该是最大值。

Generating signal voltages from UART tx-pin