1
0
mirror of git://sigrok.org/libserialport synced 2023-08-10 21:13:24 +03:00

Apply sane termios settings at port open time.

This commit is contained in:
Martin Ling 2013-11-14 21:43:07 +00:00
parent 80186526b2
commit 9cb98459a8

View File

@ -412,6 +412,7 @@ int sp_open(struct sp_port *port, int flags)
return SP_ERR_FAIL; return SP_ERR_FAIL;
#else #else
int flags_local = 0; int flags_local = 0;
struct sp_port_data data;
/* Map 'flags' to the OS-specific settings. */ /* Map 'flags' to the OS-specific settings. */
if (flags & SP_MODE_RDWR) if (flags & SP_MODE_RDWR)
@ -423,6 +424,22 @@ int sp_open(struct sp_port *port, int flags)
if ((port->fd = open(port->name, flags_local)) < 0) if ((port->fd = open(port->name, flags_local)) < 0)
return SP_ERR_FAIL; return SP_ERR_FAIL;
start_config(port, &data);
/* Turn off all serial port cooking. */
data.term.c_iflag &= ~(ISTRIP | INLCR | ICRNL);
data.term.c_oflag &= ~(ONLCR | OCRNL | ONOCR);
#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
data.term.c_oflag &= ~OFILL;
#endif
/* Disable canonical mode, and don't echo input characters. */
data.term.c_lflag &= ~(ICANON | ECHO);
/* Ignore modem status lines; enable receiver */
data.term.c_cflag |= (CLOCAL | CREAD);
apply_config(port, &data);
#endif #endif
return SP_OK; return SP_OK;
@ -892,18 +909,6 @@ static int apply_config(struct sp_port *port, struct sp_port_data *data)
#else #else
int controlbits; int controlbits;
/* Turn off all serial port cooking. */
data->term.c_iflag &= ~(ISTRIP | INLCR | ICRNL);
data->term.c_oflag &= ~(ONLCR | OCRNL | ONOCR);
#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
data->term.c_oflag &= ~OFILL;
#endif
/* Disable canonical mode, and don't echo input characters. */
data->term.c_lflag &= ~(ICANON | ECHO);
/* Ignore modem status lines; enable receiver */
data->term.c_cflag |= (CLOCAL | CREAD);
/* Asymmetric use of RTS/CTS not supported yet. */ /* Asymmetric use of RTS/CTS not supported yet. */
if ((data->rts == SP_RTS_FLOW_CONTROL) != (data->cts == SP_CTS_FLOW_CONTROL)) if ((data->rts == SP_RTS_FLOW_CONTROL) != (data->cts == SP_CTS_FLOW_CONTROL))
return SP_ERR_ARG; return SP_ERR_ARG;