From: Uffe Jakobsen Date: Sat, 1 Nov 2014 18:35:30 +0000 (+0100) Subject: ols: Fix a serial port related issue on FreeBSD. X-Git-Tag: libsigrok-0.4.0~813 X-Git-Url: http://sigrok.org/gitweb/?a=commitdiff_plain;h=bce75f947dfc35eb67caa90f3c8dc9f20bdc36cb;p=libsigrok.git ols: Fix a serial port related issue on FreeBSD. Add sp_drain() to ensure bytes have actually been transmitted over the wire. This fixes bug #414. --- diff --git a/src/hardware/openbench-logic-sniffer/protocol.c b/src/hardware/openbench-logic-sniffer/protocol.c index 00068ebd..0a816d01 100644 --- a/src/hardware/openbench-logic-sniffer/protocol.c +++ b/src/hardware/openbench-logic-sniffer/protocol.c @@ -33,6 +33,9 @@ SR_PRIV int send_shortcommand(struct sr_serial_dev_inst *serial, if (serial_write_blocking(serial, buf, 1, serial_timeout(serial, 1)) != 1) return SR_ERR; + if (serial_drain(serial) != 0) + return SR_ERR; + return SR_OK; } @@ -51,6 +54,9 @@ SR_PRIV int send_longcommand(struct sr_serial_dev_inst *serial, if (serial_write_blocking(serial, buf, 5, serial_timeout(serial, 1)) != 5) return SR_ERR; + if (serial_drain(serial) != 0) + return SR_ERR; + return SR_OK; } diff --git a/src/libsigrok-internal.h b/src/libsigrok-internal.h index b2564eca..432a4c21 100644 --- a/src/libsigrok-internal.h +++ b/src/libsigrok-internal.h @@ -631,6 +631,7 @@ typedef gboolean (*packet_valid_callback)(const uint8_t *buf); SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags); SR_PRIV int serial_close(struct sr_serial_dev_inst *serial); SR_PRIV int serial_flush(struct sr_serial_dev_inst *serial); +SR_PRIV int serial_drain(struct sr_serial_dev_inst *serial); SR_PRIV int serial_write_blocking(struct sr_serial_dev_inst *serial, const void *buf, size_t count, unsigned int timeout_ms); SR_PRIV int serial_write_nonblocking(struct sr_serial_dev_inst *serial, diff --git a/src/serial.c b/src/serial.c index 37463573..192b18a7 100644 --- a/src/serial.c +++ b/src/serial.c @@ -4,6 +4,7 @@ * Copyright (C) 2010-2012 Bert Vermeulen * Copyright (C) 2010-2012 Uwe Hermann * Copyright (C) 2012 Alexandru Gagniuc + * Copyright (C) 2014 Uffe Jakobsen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -169,6 +170,44 @@ SR_PRIV int serial_flush(struct sr_serial_dev_inst *serial) return SR_OK; } +/** + * Drain serial port buffers. + * + * @param serial Previously initialized serial port structure. + * + * @retval SR_OK Success. + * @retval SR_ERR Failure. + */ +SR_PRIV int serial_drain(struct sr_serial_dev_inst *serial) +{ + int ret; + char *error; + + if (!serial) { + sr_dbg("Invalid serial port."); + return SR_ERR; + } + + if (!serial->data) { + sr_dbg("Cannot drain unopened serial port %s.", serial->port); + return SR_ERR; + } + + sr_spew("Draining serial port %s.", serial->port); + + ret = sp_drain(serial->data); + + if (ret == SP_ERR_FAIL) { + error = sp_last_error_message(); + sr_err("Error draining port (%d): %s.", + sp_last_error_code(), error); + sp_free_error_message(error); + return SR_ERR; + } + + return SR_OK; +} + static int _serial_write(struct sr_serial_dev_inst *serial, const void *buf, size_t count, int nonblocking, unsigned int timeout_ms) {