X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fscpi%2Fscpi.c;h=8d24ceea97e29c88de244fae03600a8cf52b6507;hb=c4f0fdab273bcf4c06444a05be296e8d04c6d7a9;hp=0e74b32901f10e21b4a657d2ddebd57dbd401957;hpb=d822f54d523cf3956c081332f0ef9b427926e058;p=libsigrok.git diff --git a/src/scpi/scpi.c b/src/scpi/scpi.c index 0e74b329..8d24ceea 100644 --- a/src/scpi/scpi.c +++ b/src/scpi/scpi.c @@ -38,6 +38,7 @@ static const char *scpi_vendors[][2] = { { "Keysight Technologies", "Keysight" }, { "PHILIPS", "Philips" }, { "RIGOL TECHNOLOGIES", "Rigol" }, + { "Siglent Technologies", "Siglent" }, }; /** @@ -1037,7 +1038,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;