]> sigrok.org Git - libsigrok.git/blobdiff - hardware/common/serial.c
serial: Added flag IXANY (any char will restart) to XON/XOFF handshaking.
[libsigrok.git] / hardware / common / serial.c
index e32c0f1e2656571f6d564e6bebd76d89f5c13aad..0c64203fc8bf7f833645a8ff49cbf79422dab834 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * This file is part of the sigrok project.
+ * This file is part of the libsigrok project.
  *
  * Copyright (C) 2010-2012 Bert Vermeulen <bert@biot.com>
  * Copyright (C) 2010-2012 Uwe Hermann <uwe@hermann-uwe.de>
@@ -27,7 +27,6 @@
 #ifdef _WIN32
 #include <windows.h>
 #else
-#include <glob.h>
 #include <termios.h>
 #include <sys/ioctl.h>
 #endif
 #include "libsigrok.h"
 #include "libsigrok-internal.h"
 
-/* Message logging helpers with driver-specific prefix string. */
-#define DRIVER_LOG_DOMAIN "serial: "
-#define sr_log(l, s, args...) sr_log(l, DRIVER_LOG_DOMAIN s, ## args)
-#define sr_spew(s, args...) sr_spew(DRIVER_LOG_DOMAIN s, ## args)
-#define sr_dbg(s, args...) sr_dbg(DRIVER_LOG_DOMAIN s, ## args)
-#define sr_info(s, args...) sr_info(DRIVER_LOG_DOMAIN s, ## args)
-#define sr_warn(s, args...) sr_warn(DRIVER_LOG_DOMAIN s, ## args)
-#define sr_err(s, args...) sr_err(DRIVER_LOG_DOMAIN s, ## args)
+/* 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)
 
 // FIXME: Must be moved, or rather passed as function argument.
 #ifdef _WIN32
@@ -549,7 +548,7 @@ SR_PRIV int serial_set_params(struct sr_serial_dev_inst *serial, int baudrate,
                return SR_ERR;
        }
 
-       term.c_iflag &= ~(IXON | IXOFF);
+       term.c_iflag &= ~(IXON | IXOFF | IXANY);
        term.c_cflag &= ~CRTSCTS;
        switch (flowcontrol) {
        case 0:
@@ -562,7 +561,7 @@ SR_PRIV int serial_set_params(struct sr_serial_dev_inst *serial, int baudrate,
                break;
        case 2:
                sr_spew("Configuring XON/XOFF flow control.");
-               term.c_iflag |= IXON | IXOFF;
+               term.c_iflag |= (IXON | IXOFF | IXANY);
                break;
        default:
                sr_err("Unsupported flow control setting %d.", flowcontrol);
@@ -570,7 +569,7 @@ SR_PRIV int serial_set_params(struct sr_serial_dev_inst *serial, int baudrate,
        }
 
        term.c_iflag &= ~IGNPAR;
-       term.c_cflag &= ~(PARODD | PARENB);
+       term.c_cflag &= ~(PARENB | PARODD);
        switch (parity) {
        case SERIAL_PARITY_NONE:
                sr_spew("Configuring no parity.");
@@ -591,7 +590,10 @@ SR_PRIV int serial_set_params(struct sr_serial_dev_inst *serial, int baudrate,
 
        /* Turn off all serial port cooking. */
        term.c_iflag &= ~(ISTRIP | INLCR | ICRNL);
-       term.c_oflag &= ~(ONLCR | OCRNL | ONOCR | OFILL );
+       term.c_oflag &= ~(ONLCR | OCRNL | ONOCR);
+#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
+       term.c_oflag &= ~OFILL;
+#endif
 
        /* Disable canonical mode, and don't echo input characters. */
        term.c_lflag &= ~(ICANON | ECHO);
@@ -784,7 +786,8 @@ SR_PRIV int serial_readline(struct sr_serial_dev_inst *serial, char **buf,
                if (g_get_monotonic_time() - start > timeout_ms)
                        /* Timeout */
                        break;
-               g_usleep(2000);
+               if (len < 1)
+                       g_usleep(2000);
        }
        if (*buflen)
                sr_dbg("Received %d: '%s'.", *buflen, *buf);
@@ -865,7 +868,8 @@ SR_PRIV int serial_stream_detect(struct sr_serial_dev_inst *serial,
                        sr_dbg("Detection timed out after %dms.", time);
                        break;
                }
-               g_usleep(byte_delay_us);
+               if (len < 1)
+                       g_usleep(byte_delay_us);
        }
 
        *buflen = ibuf;