X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fcommon%2Fserial.c;h=9a9a0d94fd3b3058e84ba74202db681de8397885;hb=102f12396660e0784134bccce5cc0679db325751;hp=a7376af00dc253f663da44f97d55eb7b655674b7;hpb=3544f848e0d7f67af8e11ce7ec344b34cd797df3;p=libsigrok.git diff --git a/hardware/common/serial.c b/hardware/common/serial.c index a7376af0..9a9a0d94 100644 --- a/hardware/common/serial.c +++ b/hardware/common/serial.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "libsigrok.h" #include "libsigrok-internal.h" @@ -32,13 +33,14 @@ * Open the specified serial port. * * @param serial Previously initialized serial port structure. - * @param flags Flags to use when opening the serial port. Possible flags + * @param[in] flags Flags to use when opening the serial port. Possible flags * include SERIAL_RDWR, SERIAL_RDONLY, SERIAL_NONBLOCK. * * If the serial structure contains a serialcomm string, it will be * passed to serial_set_paramstr() after the port is opened. * - * @return SR_OK on success, SR_ERR on failure. + * @retval SR_OK Success. + * @retval SR_ERR Failure. */ SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags) { @@ -87,7 +89,8 @@ SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags) * * @param serial Previously initialized serial port structure. * - * @return SR_OK on success, SR_ERR on failure. + * @retval SR_OK Success. + * @retval SR_ERR Failure. */ SR_PRIV int serial_close(struct sr_serial_dev_inst *serial) { @@ -131,7 +134,8 @@ SR_PRIV int serial_close(struct sr_serial_dev_inst *serial) * * @param serial Previously initialized serial port structure. * - * @return SR_OK on success, SR_ERR on failure. + * @retval SR_OK Success. + * @retval SR_ERR Failure. */ SR_PRIV int serial_flush(struct sr_serial_dev_inst *serial) { @@ -167,17 +171,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; @@ -192,7 +187,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); @@ -214,16 +209,44 @@ 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[in] buf Buffer containing the bytes to write. + * @param[in] count Number of bytes to write. * - * @return The number of bytes read, or a negative error code upon failure. + * @retval SR_ERR_ARG Invalid argument. + * @retval SR_ERR Other error. + * @retval other The number of bytes written. */ -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); +} + +/** + * Write a number of bytes to the specified serial port, blocking until finished. + * @copydetails serial_write() + */ +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); +} + +/** + * Write a number of bytes to the specified serial port, return immediately. + * @copydetails serial_write() +*/ +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; @@ -238,7 +261,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); @@ -260,6 +283,44 @@ 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[in] count The number of bytes to read. + * + * @retval SR_ERR_ARG Invalid argument. + * @retval SR_ERR Other error. + * @retval other The number of bytes read. + */ +SR_PRIV int serial_read(struct sr_serial_dev_inst *serial, void *buf, + size_t count) +{ + return _serial_read(serial, buf, count, serial->nonblocking); +} + +/** + * Read a number of bytes from the specified serial port, block until finished. + * @copydetails serial_read() + */ +SR_PRIV int serial_read_blocking(struct sr_serial_dev_inst *serial, void *buf, + size_t count) +{ + return _serial_read(serial, buf, count, 0); +} + +/** + * Try to read up to @a count bytes from the specified serial port, return + * immediately with what's available. + * @copydetails serial_read() + */ +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. * @@ -273,7 +334,7 @@ SR_PRIV int serial_read(struct sr_serial_dev_inst *serial, void *buf, * @param[in] rts Status of RTS line (0 or 1; required by some interfaces). * @param[in] dtr Status of DTR line (0 or 1; required by some interfaces). * - * @retval SR_OK Success + * @retval SR_OK Success. * @retval SR_ERR Failure. */ SR_PRIV int serial_set_params(struct sr_serial_dev_inst *serial, int baudrate, @@ -338,21 +399,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 + * "/{/