Add sp_input_waiting() and sp_output_waiting() functions.

This commit is contained in:
Martin Ling 2013-11-27 02:55:18 +00:00
parent e3dcf9068e
commit 3353c22f32
2 changed files with 64 additions and 0 deletions

View File

@ -827,6 +827,24 @@ enum sp_return sp_blocking_write(struct sp_port *port, const void *buf, size_t c
*/
enum sp_return sp_nonblocking_write(struct sp_port *port, const void *buf, size_t count);
/**
* Gets the number of bytes waiting in the input buffer.
*
* @param port Pointer to port structure.
*
* @return Number of bytes waiting on success, a negative error code otherwise.
*/
enum sp_return sp_input_waiting(struct sp_port *port);
/**
* Gets the number of bytes waiting in the output buffer.
*
* @param port Pointer to port structure.
*
* @return Number of bytes waiting on success, a negative error code otherwise.
*/
enum sp_return sp_output_waiting(struct sp_port *port);
/**
* Flush serial port buffers. Data in the selected buffer(s) is discarded.
*

View File

@ -1131,6 +1131,52 @@ enum sp_return sp_nonblocking_read(struct sp_port *port, void *buf, size_t count
#endif
}
enum sp_return sp_input_waiting(struct sp_port *port)
{
TRACE("%p", port);
CHECK_OPEN_PORT();
DEBUG("Checking input bytes waiting on port %s", port->name);
#ifdef _WIN32
DWORD errors;
COMSTAT comstat;
if (ClearCommError(port->hdl, &errors, &comstat) == 0)
RETURN_FAIL("ClearComError() failed");
RETURN_VALUE("%d", comstat.cbInQue);
#else
int bytes_waiting;
if (ioctl(port->fd, TIOCINQ, &bytes_waiting) < 0)
RETURN_FAIL("TIOCINQ ioctl failed");
RETURN_VALUE("%d", bytes_waiting);
#endif
}
enum sp_return sp_output_waiting(struct sp_port *port)
{
TRACE("%p", port);
CHECK_OPEN_PORT();
DEBUG("Checking output bytes waiting on port %s", port->name);
#ifdef _WIN32
DWORD errors;
COMSTAT comstat;
if (ClearCommError(port->hdl, &errors, &comstat) == 0)
RETURN_FAIL("ClearComError() failed");
RETURN_VALUE("%d", comstat.cbOutQue);
#else
int bytes_waiting;
if (ioctl(port->fd, TIOCOUTQ, &bytes_waiting) < 0)
RETURN_FAIL("TIOCOUTQ ioctl failed");
RETURN_VALUE("%d", bytes_waiting);
#endif
}
#ifdef __linux__
static enum sp_return get_baudrate(int fd, int *baudrate)
{