X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fserial.c;h=fe39effc604f10119dcc822d4b0281557697115a;hb=31907b76de541441a4b5cff68fecf002f876cd92;hp=7f9de4f686f1f08fb01d11276420ae5f09a9dd2e;hpb=bf6b9e7b16264d2a6ccb3ac2a6004cbc2cef0e43;p=libsigrok.git diff --git a/src/serial.c b/src/serial.c index 7f9de4f6..fe39effc 100644 --- a/src/serial.c +++ b/src/serial.c @@ -122,10 +122,13 @@ 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; + } + + return serial_flush(serial); } /** @@ -244,7 +247,9 @@ SR_PRIV int serial_drain(struct sr_serial_dev_inst *serial) * @retval SR_ERR_ARG Invalid parameters. * @retval SR_OK Successful registration. * - * Callbacks get unregistered by specifying #NULL for the 'cb' parameter. + * Callbacks get unregistered by specifying NULL for the 'cb' parameter. + * + * @private */ SR_PRIV int serial_set_read_chunk_cb(struct sr_serial_dev_inst *serial, serial_rx_chunk_callback cb, void *cb_data) @@ -264,7 +269,7 @@ SR_PRIV int serial_set_read_chunk_cb(struct sr_serial_dev_inst *serial, * * @param[in] serial Previously opened serial port instance. * - * @internal + * @private */ SR_PRIV void sr_ser_discard_queued_data(struct sr_serial_dev_inst *serial) { @@ -280,7 +285,7 @@ SR_PRIV void sr_ser_discard_queued_data(struct sr_serial_dev_inst *serial) * * @param[in] serial Previously opened serial port instance. * - * @internal + * @private */ SR_PRIV size_t sr_ser_has_queued_data(struct sr_serial_dev_inst *serial) { @@ -298,7 +303,7 @@ SR_PRIV size_t sr_ser_has_queued_data(struct sr_serial_dev_inst *serial) * @param[in] data Pointer to data bytes to queue. * @param[in] len Number of data bytes to queue. * - * @internal + * @private */ SR_PRIV void sr_ser_queue_rx_data(struct sr_serial_dev_inst *serial, const uint8_t *data, size_t len) @@ -320,7 +325,7 @@ SR_PRIV void sr_ser_queue_rx_data(struct sr_serial_dev_inst *serial, * @param[out] data Pointer to store retrieved data bytes into. * @param[in] len Number of data bytes to retrieve. * - * @internal + * @private */ SR_PRIV size_t sr_ser_unqueue_rx_data(struct sr_serial_dev_inst *serial, uint8_t *data, size_t len) @@ -355,6 +360,8 @@ SR_PRIV size_t sr_ser_unqueue_rx_data(struct sr_serial_dev_inst *serial, * * Returns 0 if no receive data is available, or if the amount of * available receive data cannot get determined. + * + * @private */ SR_PRIV size_t serial_has_receive_data(struct sr_serial_dev_inst *serial) { @@ -570,7 +577,7 @@ SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial, const char *paramstr) { /** @cond PRIVATE */ -#define SERIAL_COMM_SPEC "^(\\d+)/([5678])([neo])([12])(.*)$" +#define SERIAL_COMM_SPEC "^(\\d+)(/([5678])([neo])([12]))?(.*)$" /** @endcond */ GRegex *reg; @@ -578,7 +585,10 @@ SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial, int speed, databits, parity, stopbits, flow, rts, dtr, i; char *mstr, **opts, **kv; - speed = databits = parity = stopbits = flow = 0; + speed = flow = 0; + databits = 8; + parity = SP_PARITY_NONE; + stopbits = 1; rts = dtr = -1; sr_spew("Parsing parameters from \"%s\".", paramstr); reg = g_regex_new(SERIAL_COMM_SPEC, 0, 0, NULL); @@ -586,10 +596,10 @@ SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial, if ((mstr = g_match_info_fetch(match, 1))) speed = strtoul(mstr, NULL, 10); g_free(mstr); - if ((mstr = g_match_info_fetch(match, 2))) + if ((mstr = g_match_info_fetch(match, 3)) && mstr[0]) databits = strtoul(mstr, NULL, 10); g_free(mstr); - if ((mstr = g_match_info_fetch(match, 3))) { + if ((mstr = g_match_info_fetch(match, 4)) && mstr[0]) { switch (mstr[0]) { case 'n': parity = SP_PARITY_NONE; @@ -603,10 +613,10 @@ SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial, } } g_free(mstr); - if ((mstr = g_match_info_fetch(match, 4))) + if ((mstr = g_match_info_fetch(match, 5)) && mstr[0]) stopbits = strtoul(mstr, NULL, 10); g_free(mstr); - if ((mstr = g_match_info_fetch(match, 5)) && mstr[0] != '\0') { + if ((mstr = g_match_info_fetch(match, 6)) && mstr[0] != '\0') { if (mstr[0] != '/') { sr_dbg("missing separator before extra options"); speed = 0; @@ -654,6 +664,8 @@ SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial, } g_match_info_unref(match); g_regex_unref(reg); + 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,