From: Gerhard Sittig Date: Sat, 5 Oct 2019 11:26:29 +0000 (+0200) Subject: scpi: comment on indefinite length block data (unsupported here) X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=7d7306b25c301c0a264993c8478f6e8930e905aa;p=libsigrok.git scpi: comment on indefinite length block data (unsupported here) 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. --- diff --git a/src/scpi/scpi.c b/src/scpi/scpi.c index 0e74b329..be829af4 100644 --- a/src/scpi/scpi.c +++ b/src/scpi/scpi.c @@ -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;