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;
}
/**
* @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)
*
* @param[in] serial Previously opened serial port instance.
*
- * @internal
+ * @private
*/
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)
{
* @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)
* @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)
*
* 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)
{
const char *paramstr)
{
/** @cond PRIVATE */
-#define SERIAL_COMM_SPEC "^(\\d+)/([5678])([neo])([12])(.*)$"
+#define SERIAL_COMM_SPEC "^(\\d+)(/([5678])([neo])([12]))?(.*)$"
/** @endcond */
GRegex *reg;
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);
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;
}
}
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;
}
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,