- int len, ret;
-
- len = BUFFER_SIZE - sscpi->count;
-
- /* Try to read new data into the buffer if there is space. */
- if (len > 0) {
- ret = serial_read_nonblocking(sscpi->serial, sscpi->buffer + sscpi->read,
- BUFFER_SIZE - sscpi->count);
-
- if (ret < 0)
- return ret;
-
- sscpi->count += ret;
-
- if (ret > 0)
- sr_spew("Read %d bytes into buffer.", ret);
- }
-
- /* Return as many bytes as possible from buffer, excluding any trailing newline. */
- if (sscpi->read < sscpi->count) {
- len = sscpi->count - sscpi->read;
- if (len > maxlen)
- len = maxlen;
- if (sscpi->buffer[sscpi->read + len - 1] == '\n')
- len--;
- sr_spew("Returning %d bytes from buffer.", len);
- memcpy(buf, sscpi->buffer + sscpi->read, len);
- sscpi->read += len;
- if (sscpi->read == BUFFER_SIZE) {
- sr_spew("Resetting buffer.");
- sscpi->count = 0;
- sscpi->read = 0;
- }
- return len;
+ int ret;
+
+ /* Try to read new data into the buffer. */
+ ret = serial_read_nonblocking(sscpi->serial, buf, maxlen);
+ if (ret < 0)
+ return ret;
+
+ /*
+ * Check for line termination at the end of the receive data.
+ * Handle the usual case of NL, as well as the unusual NL+CR
+ * combination (some GWInstek DMMs were found to do this).
+ */
+ sscpi->got_newline = FALSE;
+ if (ret >= 1 && buf[ret - 1] == '\n') {
+ sscpi->got_newline = TRUE;
+ sr_spew("Received NL terminator");
+ } else if (ret >= 2 && buf[ret - 2] == '\n' && buf[ret - 1] == '\r') {
+ ret--;
+ sscpi->got_newline = TRUE;
+ sr_spew("Received NL+CR terminator");