- switch (baudrate) {
- case 115200:
- dcb.BaudRate = CBR_115200;
- break;
- case 57600:
- dcb.BaudRate = CBR_57600;
- break;
- case 38400:
- dcb.BaudRate = CBR_38400;
- break;
- case 19200:
- dcb.BaudRate = CBR_19200;
- break;
- case 9600:
- dcb.BaudRate = CBR_9600;
- break;
- case 4800:
- dcb.BaudRate = CBR_4800;
- break;
- case 2400:
- dcb.BaudRate = CBR_2400;
- break;
- default:
- sr_err("Unsupported baudrate %d.", baudrate);
- return SR_ERR;
- }
- dcb.ByteSize = bits;
- dcb.Parity = NOPARITY; /* TODO: Don't hardcode. */
- dcb.StopBits = ONESTOPBIT; /* TODO: Don't hardcode. */
-
- if (!SetCommState(hdl, &dcb))
- return SR_ERR;
-#else
- struct termios term;
- speed_t baud;
- int ret, controlbits;
-
- if (tcgetattr(serial->fd, &term) < 0) {
- sr_err("tcgetattr() error on port %s (fd %d): %s.",
- serial->port, serial->fd, strerror(errno));
- return SR_ERR;
- }
-
- switch (baudrate) {
- case 50:
- baud = B50;
- break;
- case 75:
- baud = B75;
- break;
- case 110:
- baud = B110;
- break;
- case 134:
- baud = B134;
- break;
- case 150:
- baud = B150;
- break;
- case 200:
- baud = B200;
- break;
- case 300:
- baud = B300;
- break;
- case 600:
- baud = B600;
- break;
- case 1200:
- baud = B1200;
- break;
- case 1800:
- baud = B1800;
- break;
- case 2400:
- baud = B2400;
- break;
- case 4800:
- baud = B4800;
- break;
- case 9600:
- baud = B9600;
- break;
- case 19200:
- baud = B19200;
- break;
- case 38400:
- baud = B38400;
- break;
- case 57600:
- baud = B57600;
- break;
- case 115200:
- baud = B115200;
- break;
- case 230400:
- baud = B230400;
- break;
-#ifndef __APPLE__
- case 460800:
- baud = B460800;
- break;
-#endif
- default:
- sr_err("Unsupported baudrate %d.", baudrate);
- return SR_ERR;
- }
-
- sr_spew("Configuring output baudrate to %d (%d).", baudrate, baud);
- if (cfsetospeed(&term, baud) < 0) {
- sr_err("cfsetospeed() error: %s.", strerror(errno));
- return SR_ERR;
- }
-
- sr_spew("Configuring input baudrate to %d (%d).", baudrate, baud);
- if (cfsetispeed(&term, baud) < 0) {
- sr_err("cfsetispeed() error: %s.", strerror(errno));
- return SR_ERR;
- }
-
- sr_spew("Configuring %d data bits.", bits);
- term.c_cflag &= ~CSIZE;
- switch (bits) {
- case 8:
- term.c_cflag |= CS8;
- break;
- case 7:
- term.c_cflag |= CS7;
- break;
- default:
- sr_err("Unsupported data bits number %d.", bits);
- return SR_ERR;
- }
-
- sr_spew("Configuring %d stop bits.", stopbits);
- term.c_cflag &= ~CSTOPB;
- switch (stopbits) {
- case 1:
- term.c_cflag &= ~CSTOPB;
- 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_spew("Configuring no flow control.");
- break;
- case 1:
- sr_spew("Configuring RTS/CTS flow control.");
- term.c_cflag |= CRTSCTS;
- break;
- case 2:
- sr_spew("Configuring XON/XOFF flow control.");
- term.c_iflag |= IXON | IXOFF;
- break;
- default:
- sr_err("Unsupported flow control setting %d.", flowcontrol);
- return SR_ERR;
- }