Finish serial_set_params implementation
Adds the most common baud rates and support bits, parity, stopbits and flocontrol settings.
This commit is contained in:
parent
9b36e360f3
commit
9d4bde70fc
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue