X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=libserialport.h.in;h=41948c1828eee3bab22fdc1e60187233489e88c8;hb=2c827b218813f2663fc3fb09d2ad61f50c4ec1ff;hp=649eb2c8755bf9814deaa66f873b61fe4ff468da;hpb=e432ce60065f9d073dca5d639a4fc179de566639;p=libserialport.git diff --git a/libserialport.h.in b/libserialport.h.in index 649eb2c..41948c1 100644 --- a/libserialport.h.in +++ b/libserialport.h.in @@ -120,8 +120,6 @@ enum sp_mode { SP_MODE_READ = 1, /** Open port for write access. */ SP_MODE_WRITE = 2, - /** Open port in non-blocking mode. */ - SP_MODE_NONBLOCK = 4, }; /** Buffer selection. */ @@ -758,34 +756,114 @@ enum sp_return sp_set_flowcontrol(struct sp_port *port, enum sp_flowcontrol flow */ /** - * Read bytes from the specified serial port. + * Read bytes from the specified serial port, blocking until complete. * - * Note that this function may return after reading less than the specified - * number of bytes; it is the user's responsibility to iterate as necessary - * in this case. + * @warning If your program runs on Unix, defines its own signal handlers, and + * needs to abort blocking reads when these are called, then you + * should not use this function. It repeats system calls that return + * with EINTR. To be able to abort a read from a signal handler, you + * should implement your own blocking read using sp_nonblocking_read() + * together with a blocking method that makes sense for your program. + * E.g. you can obtain the file descriptor for an open port using + * sp_get_port_handle() and use this to call select() or pselect(), + * with appropriate arrangements to return if a signal is received. + * + * @param port Pointer to port structure. + * @param buf Buffer in which to store the bytes read. + * @param count Requested number of bytes to read. + * @param timeout Timeout in milliseconds, or zero to wait indefinitely. + * + * @return The number of bytes read on success, or a negative error code. If + * the number of bytes returned is less than that requested, the + * timeout was reached before the requested number of bytes was + * available. If timeout is zero, the function will always return + * either the requested number of bytes or a negative error code. + */ +enum sp_return sp_blocking_read(struct sp_port *port, void *buf, size_t count, unsigned int timeout); + +/** + * Read bytes from the specified serial port, without blocking. * * @param port Pointer to port structure. * @param buf Buffer in which to store the bytes read. * @param count Maximum number of bytes to read. * - * @return The number of bytes read on success, or a negative error code. + * @return The number of bytes read on success, or a negative error code. The + * number of bytes returned may be any number from zero to the maximum + * that was requested. + */ +enum sp_return sp_nonblocking_read(struct sp_port *port, void *buf, size_t count); + +/** + * Write bytes to the specified serial port, blocking until complete. + * + * Note that this function only ensures that the accepted bytes have been + * written to the OS; they may be held in driver or hardware buffers and not + * yet physically transmitted. To check whether all written bytes have actually + * been transmitted, use the sp_output_waiting() function. To wait until all + * written bytes have actually been transmitted, use the sp_drain() function. + * + * @warning If your program runs on Unix, defines its own signal handlers, and + * needs to abort blocking writes when these are called, then you + * should not use this function. It repeats system calls that return + * with EINTR. To be able to abort a write from a signal handler, you + * should implement your own blocking write using sp_nonblocking_write() + * together with a blocking method that makes sense for your program. + * E.g. you can obtain the file descriptor for an open port using + * sp_get_port_handle() and use this to call select() or pselect(), + * with appropriate arrangements to return if a signal is received. + * + * @param port Pointer to port structure. + * @param buf Buffer containing the bytes to write. + * @param count Requested number of bytes to write. + * @param timeout Timeout in milliseconds, or zero to wait indefinitely. + * + * @return The number of bytes written on success, or a negative error code. + * If the number of bytes returned is less than that requested, the + * timeout was reached before the requested number of bytes was + * written. If timeout is zero, the function will always return + * either the requested number of bytes or a negative error code. In + * the event of an error there is no way to determine how many bytes + * were sent before the error occured. */ -enum sp_return sp_read(struct sp_port *port, void *buf, size_t count); +enum sp_return sp_blocking_write(struct sp_port *port, const void *buf, size_t count, unsigned int timeout); /** - * Write bytes to the specified serial port. + * Write bytes to the specified serial port, without blocking. * - * Note that this function may return after writing less than the specified - * number of bytes; it is the user's responsibility to iterate as necessary - * in this case. + * Note that this function only ensures that the accepted bytes have been + * written to the OS; they may be held in driver or hardware buffers and not + * yet physically transmitted. To check whether all written bytes have actually + * been transmitted, use the sp_output_waiting() function. To wait until all + * written bytes have actually been transmitted, use the sp_drain() function. * * @param port Pointer to port structure. * @param buf Buffer containing the bytes to write. * @param count Maximum number of bytes to write. * * @return The number of bytes written on success, or a negative error code. + * The number of bytes returned may be any number from zero to the + * maximum that was requested. + */ +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_write(struct sp_port *port, const void *buf, size_t count); +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. @@ -800,6 +878,13 @@ enum sp_return sp_flush(struct sp_port *port, enum sp_buffer buffers); /** * Wait for buffered data to be transmitted. * + * @warning If your program runs on Unix, defines its own signal handlers, and + * needs to abort draining the output buffer when when these are + * called, then you should not use this function. It repeats system + * calls that return with EINTR. To be able to abort a drain from a + * signal handler, you would need to implement your own blocking + * drain by polling the result of sp_output_waiting(). + * * @param port Pointer to port structure. * * @return SP_OK upon success, a negative error code otherwise.