X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fserial.c;h=1b76c935e3a0e1b73874b875185a18105f1f7f37;hb=2cb4204c6f31b58a4713ce39b77d37b95f0b20f5;hp=106090b72927e230a6dd389f04a640fe312f94ab;hpb=dbb3e2ad3ddb927a0765f1250eabac8f2c715fa5;p=libsigrok.git diff --git a/src/serial.c b/src/serial.c index 106090b7..1b76c935 100644 --- a/src/serial.c +++ b/src/serial.c @@ -122,10 +122,24 @@ SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags) if (ret != SR_OK) return ret; - if (serial->serialcomm) - return serial_set_paramstr(serial, serial->serialcomm); - else - return SR_OK; + if (serial->serialcomm) { + ret = serial_set_paramstr(serial, serial->serialcomm); + if (ret != SR_OK) + return ret; + } + + /* + * Flush potentially dangling RX data. Availability of the + * flush primitive depends on the transport/cable, absense + * is non-fatal. + */ + ret = serial_flush(serial); + if (ret == SR_ERR_NA) + ret = SR_OK; + if (ret != SR_OK) + return ret; + + return SR_OK; } /** @@ -547,6 +561,37 @@ SR_PRIV int serial_set_params(struct sr_serial_dev_inst *serial, return ret; } +/** + * Manipulate handshake state for the specified serial port. + * + * @param serial Previously initialized serial port structure. + * @param[in] rts Status of RTS line (0 or 1; or -1 to ignore). + * @param[in] dtr Status of DTR line (0 or 1; or -1 to ignore). + * + * @retval SR_OK Success. + * @retval SR_ERR Failure. + * + * @private + */ +SR_PRIV int serial_set_handshake(struct sr_serial_dev_inst *serial, + int rts, int dtr) +{ + int ret; + + if (!serial) { + sr_dbg("Invalid serial port."); + return SR_ERR; + } + + sr_spew("Modifying serial parameters on port %s.", serial->port); + + if (!serial->lib_funcs || !serial->lib_funcs->set_handshake) + return SR_ERR_NA; + ret = serial->lib_funcs->set_handshake(serial, rts, dtr); + + return ret; +} + /** * Set serial parameters for the specified serial port from parameter string. * @@ -664,13 +709,14 @@ SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial, sr_spew("Got params: rate %d, frame %d/%d/%d, flow %d, rts %d, dtr %d.", speed, databits, parity, stopbits, flow, rts, dtr); - if (speed) { - return serial_set_params(serial, speed, databits, parity, - stopbits, flow, rts, dtr); - } else { + if (!speed) { sr_dbg("Could not infer speed from parameter string."); return SR_ERR_ARG; } + + return serial_set_params(serial, speed, + databits, parity, stopbits, + flow, rts, dtr); } /** @@ -821,7 +867,7 @@ SR_PRIV int serial_stream_detect(struct sr_serial_dev_inst *serial, *buflen = ibuf; - sr_err("Didn't find a valid packet (read %zu bytes).", *buflen); + sr_info("Didn't find a valid packet (read %zu bytes).", *buflen); return SR_ERR; }