X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fcommon%2Fserial.c;h=32a6d23c087f61ca046f607811a38465ce21ce1e;hb=58d6f20748e6b33677da3b4a388ac3b8fcaa12f7;hp=9727ce8a36271f7a9a5c50efdc6cbaf13449b1a4;hpb=04cb915716ecdc1ee26440b4c09bc2f2de183631;p=libsigrok.git diff --git a/hardware/common/serial.c b/hardware/common/serial.c index 9727ce8a..32a6d23c 100644 --- a/hardware/common/serial.c +++ b/hardware/common/serial.c @@ -22,18 +22,12 @@ #include #include #include +#include #include #include "libsigrok.h" #include "libsigrok-internal.h" -/* Message logging helpers with subsystem-specific prefix string. */ -#define LOG_PREFIX "serial: " -#define sr_log(l, s, args...) sr_log(l, LOG_PREFIX s, ## args) -#define sr_spew(s, args...) sr_spew(LOG_PREFIX s, ## args) -#define sr_dbg(s, args...) sr_dbg(LOG_PREFIX s, ## args) -#define sr_info(s, args...) sr_info(LOG_PREFIX s, ## args) -#define sr_warn(s, args...) sr_warn(LOG_PREFIX s, ## args) -#define sr_err(s, args...) sr_err(LOG_PREFIX s, ## args) +#define LOG_PREFIX "serial" /** * Open the specified serial port. @@ -77,7 +71,8 @@ SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags) return SR_ERR_ARG; case SP_ERR_FAIL: error = sp_last_error_message(); - sr_err("Error opening port: %s.", error); + sr_err("Error opening port (%d): %s.", + sp_last_error_code(), error); sp_free_error_message(error); return SR_ERR; } @@ -120,7 +115,8 @@ SR_PRIV int serial_close(struct sr_serial_dev_inst *serial) return SR_ERR_ARG; case SP_ERR_FAIL: error = sp_last_error_message(); - sr_err("Error closing port: %s.", error); + sr_err("Error closing port (%d): %s.", + sp_last_error_code(), error); sp_free_error_message(error); return SR_ERR; } @@ -163,7 +159,8 @@ SR_PRIV int serial_flush(struct sr_serial_dev_inst *serial) return SR_ERR_ARG; case SP_ERR_FAIL: error = sp_last_error_message(); - sr_err("Error flushing port: %s.", error); + sr_err("Error flushing port (%d): %s.", + sp_last_error_code(), error); sp_free_error_message(error); return SR_ERR; } @@ -171,17 +168,8 @@ SR_PRIV int serial_flush(struct sr_serial_dev_inst *serial) return SR_OK; } -/** - * Write a number of bytes to the specified serial port. - * - * @param serial Previously initialized serial port structure. - * @param buf Buffer containing the bytes to write. - * @param count Number of bytes to write. - * - * @return The number of bytes written, or a negative error code upon failure. - */ -SR_PRIV int serial_write(struct sr_serial_dev_inst *serial, - const void *buf, size_t count) +static int _serial_write(struct sr_serial_dev_inst *serial, + const void *buf, size_t count, int nonblocking) { ssize_t ret; char *error; @@ -196,7 +184,7 @@ SR_PRIV int serial_write(struct sr_serial_dev_inst *serial, return SR_ERR; } - if (serial->nonblocking) + if (nonblocking) ret = sp_nonblocking_write(serial->data, buf, count); else ret = sp_blocking_write(serial->data, buf, count, 0); @@ -207,7 +195,7 @@ SR_PRIV int serial_write(struct sr_serial_dev_inst *serial, return SR_ERR_ARG; case SP_ERR_FAIL: error = sp_last_error_message(); - sr_err("Write error: %s.", error); + sr_err("Write error (%d): %s.", sp_last_error_code(), error); sp_free_error_message(error); return SR_ERR; } @@ -218,16 +206,34 @@ SR_PRIV int serial_write(struct sr_serial_dev_inst *serial, } /** - * Read a number of bytes from the specified serial port. + * Write a number of bytes to the specified serial port. * * @param serial Previously initialized serial port structure. - * @param buf Buffer where to store the bytes that are read. - * @param count The number of bytes to read. + * @param buf Buffer containing the bytes to write. + * @param count Number of bytes to write. * - * @return The number of bytes read, or a negative error code upon failure. + * @return The number of bytes written, or a negative error code upon failure. */ -SR_PRIV int serial_read(struct sr_serial_dev_inst *serial, void *buf, - size_t count) +SR_PRIV int serial_write(struct sr_serial_dev_inst *serial, + const void *buf, size_t count) +{ + return _serial_write(serial, buf, count, serial->nonblocking); +} + +SR_PRIV int serial_write_blocking(struct sr_serial_dev_inst *serial, + const void *buf, size_t count) +{ + return _serial_write(serial, buf, count, 0); +} + +SR_PRIV int serial_write_nonblocking(struct sr_serial_dev_inst *serial, + const void *buf, size_t count) +{ + return _serial_write(serial, buf, count, 1); +} + +static int _serial_read(struct sr_serial_dev_inst *serial, void *buf, + size_t count, int nonblocking) { ssize_t ret; char *error; @@ -242,7 +248,7 @@ SR_PRIV int serial_read(struct sr_serial_dev_inst *serial, void *buf, return SR_ERR; } - if (serial->nonblocking) + if (nonblocking) ret = sp_nonblocking_read(serial->data, buf, count); else ret = sp_blocking_read(serial->data, buf, count, 0); @@ -253,7 +259,7 @@ SR_PRIV int serial_read(struct sr_serial_dev_inst *serial, void *buf, return SR_ERR_ARG; case SP_ERR_FAIL: error = sp_last_error_message(); - sr_err("Read error: %s.", error); + sr_err("Read error (%d): %s.", sp_last_error_code(), error); sp_free_error_message(error); return SR_ERR; } @@ -264,6 +270,33 @@ SR_PRIV int serial_read(struct sr_serial_dev_inst *serial, void *buf, return ret; } +/** + * Read a number of bytes from the specified serial port. + * + * @param serial Previously initialized serial port structure. + * @param buf Buffer where to store the bytes that are read. + * @param count The number of bytes to read. + * + * @return The number of bytes read, or a negative error code upon failure. + */ +SR_PRIV int serial_read(struct sr_serial_dev_inst *serial, void *buf, + size_t count) +{ + return _serial_read(serial, buf, count, serial->nonblocking); +} + +SR_PRIV int serial_read_blocking(struct sr_serial_dev_inst *serial, void *buf, + size_t count) +{ + return _serial_read(serial, buf, count, 0); +} + +SR_PRIV int serial_read_nonblocking(struct sr_serial_dev_inst *serial, void *buf, + size_t count) +{ + return _serial_read(serial, buf, count, 1); +} + /** * Set serial parameters for the specified serial port. * @@ -332,7 +365,8 @@ SR_PRIV int serial_set_params(struct sr_serial_dev_inst *serial, int baudrate, return SR_ERR_ARG; case SP_ERR_FAIL: error = sp_last_error_message(); - sr_err("Error setting serial port parameters: %s.", error); + sr_err("Error setting serial port parameters (%d): %s.", + sp_last_error_code(), error); sp_free_error_message(error); return SR_ERR; } @@ -341,21 +375,30 @@ SR_PRIV int serial_set_params(struct sr_serial_dev_inst *serial, int baudrate, } /** - * Set serial parameters for the specified serial port. + * Set serial parameters for the specified serial port from parameter string. * * @param serial Previously initialized serial port structure. - * @param[in] paramstr A serial communication parameters string, in the form - * of \/\\\\, for example - * "9600/8n1" or "600/7o2" or "460800/8n1/flow=2" where flow is 0 for none, - * 1 for rts/cts and 2 for xon/xoff. - * + * @param[in] paramstr A serial communication parameters string of the form + * "/{/