From: Gerhard Sittig Date: Sun, 26 Mar 2017 15:56:36 +0000 (+0100) Subject: serial: determine timeout from most recent set_params() values X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=639c6f61c32e508e2d8e2330a7f21cb15e29c294;hp=dca683ef9903f6b932f104fe256a8893759dafaa;ds=sidebyside serial: determine timeout from most recent set_params() values Store the most recent successfully applied set of parameters for serial communication. Re-use these values as a fallback to calculate timeouts, when the underlying transport fails to provide the current settings. --- diff --git a/src/libsigrok-internal.h b/src/libsigrok-internal.h index 053ee4df..812cf3ce 100644 --- a/src/libsigrok-internal.h +++ b/src/libsigrok-internal.h @@ -726,6 +726,12 @@ struct sr_serial_dev_inst { char *port; /** Comm params for serial_set_paramstr(). */ char *serialcomm; + struct { + int bit_rate; + int data_bits; + int parity_bits; + int stop_bits; + } comm_params; /** libserialport port handle */ struct sp_port *sp_data; }; diff --git a/src/serial.c b/src/serial.c index 37b61875..86009e9b 100644 --- a/src/serial.c +++ b/src/serial.c @@ -468,6 +468,15 @@ SR_PRIV int serial_set_params(struct sr_serial_dev_inst *serial, int baudrate, return SR_ERR; } + serial->comm_params.bit_rate = baudrate; + serial->comm_params.data_bits = bits; + serial->comm_params.parity_bits = parity ? 1 : 0; + serial->comm_params.stop_bits = stopbits; + sr_dbg("DBG: %s() rate %d, %d%s%d", __func__, + baudrate, bits, + (parity == 0) ? "n" : "x", + stopbits); + return SR_OK; } @@ -980,6 +989,7 @@ SR_PRIV int serial_timeout(struct sr_serial_dev_inst *port, int num_bytes) if (sp_new_config(&config) < 0) return timeout_ms; + /* Get the bitrate and frame length. */ bits = baud = 0; do { if (sp_get_config(port->sp_data, config) < 0) @@ -997,7 +1007,14 @@ SR_PRIV int serial_timeout(struct sr_serial_dev_inst *port, int num_bytes) break; baud = tmp; } while (FALSE); + if (!bits || !baud) { + baud = port->comm_params.bit_rate; + bits = 1 + port->comm_params.data_bits + + port->comm_params.parity_bits + + port->comm_params.stop_bits; + } + /* Derive the timeout. */ if (bits && baud) { /* Throw in 10ms for misc OS overhead. */ timeout_ms = 10;