]> sigrok.org Git - libsigrok.git/commitdiff
scpi: comment on indefinite length block data (unsupported here)
authorGerhard Sittig <redacted>
Sat, 5 Oct 2019 11:26:29 +0000 (13:26 +0200)
committerGerhard Sittig <redacted>
Sun, 21 Aug 2022 15:45:11 +0000 (17:45 +0200)
It's fine that the current SCPI implementation in libsigrok exclusively
supports definite length block response data. It is what most supported
devices or all of them are speaking. But the implementation of the
indefinite length case assumed that the block is empty when the response
starts with #0, and returned successful although receive data was not
taken at all.

Rephrase the test condition for successful reception. Return an error
code in the unsupported case. Emit an error message to remain aware. Let
users report when that communication pattern is seen in the field. Add
comments with references to the specs, in case the feature will receive
support later.

src/scpi/scpi.c

index 0e74b32901f10e21b4a657d2ddebd57dbd401957..be829af4b0c24930fd2733dfa915bde1584c6411 100644 (file)
@@ -1037,7 +1037,29 @@ SR_PRIV int sr_scpi_get_block(struct sr_scpi_dev_inst *scpi,
        buf[0] = response->str[1];
        buf[1] = '\0';
        ret = sr_atol(buf, &llen);
-       if ((ret != SR_OK) || (llen == 0)) {
+       /*
+        * The form "#0..." is legal, and does not mean "empty response",
+        * but means that the number of data bytes is not known (or was
+        * not communicated) at this time. Instead the block ends at an
+        * "END MESSAGE" termination sequence. Which translates to active
+        * EOI while a text line termination is sent (CR or LF, and this
+        * text line termination is not part of the block's data value).
+        * Since this kind of #0... response is considered rare, and
+        * depends on specific support in physical transports underneath
+        * the SCPI layer, let's flag the condition and bail out with an
+        * error here, until it's found to be a genuine issue in the field.
+        *
+        * The SCPI 1999.0 specification (see page 220 and following in
+        * the "HCOPy" description) references IEEE 488.2, especially
+        * section 8.7.9 for DEFINITE LENGTH and section 8.7.10 for
+        * INDEFINITE LENGTH ARBITRARY BLOCK RESPONSE DATA. The latter
+        * with a leading "#0" length and a trailing "NL^END" marker.
+        */
+       if (ret == SR_OK && !llen) {
+               sr_err("unsupported INDEFINITE LENGTH ARBITRARY BLOCK RESPONSE");
+               ret = SR_ERR_NA;
+       }
+       if (ret != SR_OK) {
                g_mutex_unlock(&scpi->scpi_mutex);
                g_string_free(response, TRUE);
                return ret;