Finish serial_set_params implementation

Adds the most common baud rates and support bits, parity, stopbits
and flocontrol settings.
This commit is contained in:
Daniel Ribeiro 2011-01-10 02:21:07 -02:00 committed by Bert Vermeulen
parent 9b36e360f3
commit 9d4bde70fc
1 changed files with 71 additions and 8 deletions

View File

@ -124,7 +124,10 @@ void serial_restore_params(int fd, void *backup)
#endif #endif
} }
/* flowcontrol 1 = rts/cts 2 = xon/xoff */ /*
* flowcontrol 1 = rts/cts 2 = xon/xoff
* parity 0 = none, 1 = even, 2 = odd
*/
int serial_set_params(int fd, int speed, int bits, int parity, int stopbits, int serial_set_params(int fd, int speed, int bits, int parity, int stopbits,
int flowcontrol) int flowcontrol)
{ {
@ -165,21 +168,81 @@ int serial_set_params(int fd, int speed, int bits, int parity, int stopbits,
} }
#else #else
struct termios term; struct termios term;
speed_t baud;
/* Only supporting what we need really, currently the OLS driver. */ switch (speed) {
if (speed != 115200 || bits != 8 || parity != 0 || stopbits != 1 case 9600:
|| flowcontrol != 2) baud = B9600;
break;
case 38400:
baud = B38400;
break;
case 57600:
baud = B57600;
break;
case 115200:
baud = B115200;
break;
case 460800:
baud = B460800;
break;
default:
return SIGROK_ERR; return SIGROK_ERR;
}
if (tcgetattr(fd, &term) < 0) if (tcgetattr(fd, &term) < 0)
return SIGROK_ERR; return SIGROK_ERR;
if (cfsetispeed(&term, B115200) < 0) if (cfsetispeed(&term, baud) < 0)
return SIGROK_ERR; return SIGROK_ERR;
term.c_cflag &= ~CSIZE; term.c_cflag &= ~CSIZE;
term.c_cflag |= CS8; switch (bits) {
case 8:
term.c_cflag |= CS8;
break;
case 7:
term.c_cflag |= CS7;
break;
default:
return SIGROK_ERR;
}
term.c_cflag &= ~CSTOPB; term.c_cflag &= ~CSTOPB;
term.c_cflag |= IXON | IXOFF; switch (stopbits) {
term.c_iflag |= IGNPAR; case 1:
break;
case 2:
term.c_cflag |= CSTOPB;
default:
return SIGROK_ERR;
}
term.c_cflag &= ~(IXON | IXOFF | CRTSCTS);
switch (flowcontrol) {
case 2:
term.c_cflag |= IXON | IXOFF;
break;
case 1:
term.c_cflag |= CRTSCTS;
default:
return SIGROK_ERR;
}
term.c_iflag &= ~(IGNPAR | PARODD | PARENB);
switch (parity) {
case 0:
term.c_iflag |= IGNPAR;
break;
case 1:
term.c_iflag |= PARENB;
break;
case 2:
term.c_iflag |= PARENB | PARODD;
break;
default:
return SIGROK_ERR;
}
if (tcsetattr(fd, TCSADRAIN, &term) < 0) if (tcsetattr(fd, TCSADRAIN, &term) < 0)
return SIGROK_ERR; return SIGROK_ERR;
#endif #endif