Control RTS line [[https://github.com/xanthium-enterprises/RTS-DTR-Pin-Control-Linux]] [[https://xanthium.in/Controlling-RTS-and-DTR-pins-SerialPort-in-Linux]] [[https://www.linuxquestions.org/questions/programming-9/manually-controlling-rts-cts-326590/]] #include #include #include #include #include #include #include #include static struct termios oldterminfo; void closeserial(int fd) { tcsetattr(fd, TCSANOW, &oldterminfo); if (close(fd) < 0) perror("closeserial()"); } int openserial(char *devicename) { int fd; struct termios attr; if ((fd = open(devicename, O_RDWR)) == -1) { perror("openserial(): open()"); return 0; } if (tcgetattr(fd, &oldterminfo) == -1) { perror("openserial(): tcgetattr()"); return 0; } attr = oldterminfo; attr.c_cflag |= CRTSCTS | CLOCAL; attr.c_oflag = 0; if (tcflush(fd, TCIOFLUSH) == -1) { perror("openserial(): tcflush()"); return 0; } if (tcsetattr(fd, TCSANOW, &attr) == -1) { perror("initserial(): tcsetattr()"); return 0; } return fd; } int setRTS(int fd, int level) { int status; if (ioctl(fd, TIOCMGET, &status) == -1) { perror("setRTS(): TIOCMGET"); return 0; } if (level) status |= TIOCM_RTS; else status &= ~TIOCM_RTS; if (ioctl(fd, TIOCMSET, &status) == -1) { perror("setRTS(): TIOCMSET"); return 0; } return 1; } int main() { int fd; char *serialdev = "/dev/ttyS0"; fd = openserial(serialdev); if (!fd) { fprintf(stderr, "Error while initializing %s.\n", serialdev); return 1; } setRTS(fd, 0); sleep(1); /* pause 1 second */ setRTS(fd, 1); closeserial(fd); return 0; }