+ switch (stopbits) {
+ case 1:
+ /* Do nothing, a cleared CSTOPB entry means "1 stop bit". */
+ break;
+ case 2:
+ term.c_cflag |= CSTOPB;
+ break;
+ default:
+ sr_err("Unsupported stopbits number: %d.", stopbits);
+ return SR_ERR;
+ }
+
+ term.c_iflag &= ~(IXON | IXOFF);
+ term.c_cflag &= ~CRTSCTS;
+ switch (flowcontrol) {
+ case 0:
+ /* No flow control. */
+ sr_dbg("FD %d: Configuring no flow control.", fd);
+ break;
+ case 1:
+ sr_dbg("FD %d: Configuring RTS/CTS flow control.", fd);
+ term.c_cflag |= CRTSCTS;
+ break;
+ case 2:
+ sr_dbg("FD %d: Configuring XON/XOFF flow control.", fd);
+ term.c_iflag |= IXON | IXOFF;
+ break;
+ default:
+ sr_err("Unsupported flow control setting: %d.", flowcontrol);
+ return SR_ERR;
+ }
+
+ term.c_iflag &= ~IGNPAR;
+ term.c_cflag &= ~(PARODD | PARENB);
+ switch (parity) {
+ case SERIAL_PARITY_NONE:
+ sr_dbg("FD %d: Configuring no parity.", fd);
+ term.c_iflag |= IGNPAR;
+ break;
+ case SERIAL_PARITY_EVEN:
+ sr_dbg("FD %d: Configuring even parity.", fd);
+ term.c_cflag |= PARENB;
+ break;
+ case SERIAL_PARITY_ODD:
+ sr_dbg("FD %d: Configuring odd parity.", fd);
+ term.c_cflag |= PARENB | PARODD;
+ break;
+ default:
+ sr_err("Unsupported parity setting: %d.", parity);
+ return SR_ERR;
+ }
+
+ /* Do NOT translate carriage return to newline on input. */
+ term.c_iflag &= ~(ICRNL);
+
+ /* Disable canonical mode, and don't echo input characters. */
+ term.c_lflag &= ~(ICANON | ECHO);
+
+ /* Write the configured settings. */
+ if (tcsetattr(fd, TCSADRAIN, &term) < 0) {
+ sr_err("tcsetattr() error: %ѕ.", strerror(errno));
+ return SR_ERR;
+ }
+#endif