]> sigrok.org Git - libsigrok.git/commitdiff
serial: Only sleep when no characters are received.
authorDaniel Thompson <redacted>
Thu, 19 Sep 2013 15:39:24 +0000 (16:39 +0100)
committerBert Vermeulen <redacted>
Thu, 26 Sep 2013 12:57:37 +0000 (14:57 +0200)
g_usleep(XX) sleeps for *at least* XX microseconds but may sleep for
longers (on older kernels the sleep will typically be 10000us). Thus
byte receive loops containing an unconditional sleep will perform
very poorly (for example it causes the scan in agilent-dmm to timeout
prematurely).

Even on modern kernels serial_readline() has a 2ms sleep per byte which
means it will read at a maximum rate of half a character per millisecond
(~4800baud).

This is fixed by only sleeping when read() returns no data.

Signed-off-by: Daniel Thompson <redacted>
hardware/common/serial.c

index 306b889c7db007cdd052733776a5229841e56e35..557022c99733456151c40b267970401957817c4e 100644 (file)
@@ -786,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);
@@ -867,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;