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.
This commit is contained in:
Uffe Jakobsen 2014-11-01 19:35:30 +01:00 committed by Uwe Hermann
parent 7aebe22d10
commit bce75f947d
3 changed files with 46 additions and 0 deletions

View File

@ -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) if (serial_write_blocking(serial, buf, 1, serial_timeout(serial, 1)) != 1)
return SR_ERR; return SR_ERR;
if (serial_drain(serial) != 0)
return SR_ERR;
return SR_OK; 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) if (serial_write_blocking(serial, buf, 5, serial_timeout(serial, 1)) != 5)
return SR_ERR; return SR_ERR;
if (serial_drain(serial) != 0)
return SR_ERR;
return SR_OK; return SR_OK;
} }

View File

@ -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_open(struct sr_serial_dev_inst *serial, int flags);
SR_PRIV int serial_close(struct sr_serial_dev_inst *serial); 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_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, SR_PRIV int serial_write_blocking(struct sr_serial_dev_inst *serial,
const void *buf, size_t count, unsigned int timeout_ms); const void *buf, size_t count, unsigned int timeout_ms);
SR_PRIV int serial_write_nonblocking(struct sr_serial_dev_inst *serial, SR_PRIV int serial_write_nonblocking(struct sr_serial_dev_inst *serial,

View File

@ -4,6 +4,7 @@
* Copyright (C) 2010-2012 Bert Vermeulen <bert@biot.com> * Copyright (C) 2010-2012 Bert Vermeulen <bert@biot.com>
* Copyright (C) 2010-2012 Uwe Hermann <uwe@hermann-uwe.de> * Copyright (C) 2010-2012 Uwe Hermann <uwe@hermann-uwe.de>
* Copyright (C) 2012 Alexandru Gagniuc <mr.nuke.me@gmail.com> * Copyright (C) 2012 Alexandru Gagniuc <mr.nuke.me@gmail.com>
* Copyright (C) 2014 Uffe Jakobsen <uffe@uffe.org>
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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; 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, static int _serial_write(struct sr_serial_dev_inst *serial,
const void *buf, size_t count, int nonblocking, unsigned int timeout_ms) const void *buf, size_t count, int nonblocking, unsigned int timeout_ms)
{ {