Pergunta
Como converter o resultado binário de um traço pela interface GPIB usando o comando 'TRAC? TRACE1' ?
Como converter o resultado binário de um traço pela interface GPIB usando o comando 'TRAC? TRACE1' ?
O formato padrão depois de *RST é o ASCII. O que significa que você obterá 500
valores ASCII, que estão separados por vírgulas, em uma única cadeia de caracteres (aprox. 6 Kbyte)
que é encerrada por uma linha de alimentação (0A hex).
Para usar o formato de ponto flutuante você deve enviar o comando "FORMAT REAL,32"
antes.
O FSE responderá a consulta "TRAC? TRACE1" com uma cadeia de caracteres binária de 500 valores
flutuantes. Cada valor está no formato IEEE 754 com precisão simples de 4 bytes (32 bits)
que é usado em quase todos os compiladores (até mesmo no Visual Basic).
Portanto, nenhuma conversão precisa ser realizada, o que economiza muito tempo de
processamento. Todos os valores são enviados com o byte inferior primeiro, que é a ordem de bytes no
mundo do PC - para estações de trabalho HP favor verificar.
A cadeia de caracteres binária é formatada de acordo com o <Definite Length Arbitrary Block
Response Data> descrita na norma IEEE 488.2.
Este formato deve ser utilizado em conjunto com a informação de comprimento anterior
se a resposta de um instrumento for em formato binário.
A sintaxe de codificação é o sinal # ASCII seguido por um dígito diferente de zero. Esse
digito indica o número de dígitos que seguem e juntos especificam o
comprimento da informação binária. No caso de FSE a informação
de comprimento anterior é "#42000...", o que significa 2000 bytes (500 x 4 bytes) de
informação binária.
O exemplo de programação C abaixo usa a matriz FLOAT de precisão simples para ler
a informação sem nenhuma conversão do barramento IEEE. A informação de comprimento
anterior é simplesmente ignorada a cada deslocamento de 6 bytes da matriz.
/* DEFINE ****************************************************************/
#define MAX_NOF_POINTS 500 // número máx. de pontos por varredura
#define MAX_NOF_DATA_BYTES (MAX_NOF_POINTS * sizeof(float) + 100)
/* VARIÁVEIS **************************************************************/
UINT8 sweep_data[MAX_NOF_DATA_BYTES]; // armazena os dados carregados do FSEx
float *sweep_data_ptr= (float *)sweep_data; // pointer to sweep_data
/* Procedimentos**************************************************************/
int read_sweep_data(void)
/*
ESPECIFICAÇÃO: leia os novos dados de FSEx
Rastreamento de dados em formato binário são 500 valores flutuantes (2000 bytes)
precedidos por 6 bytes
que são usados como especificadores de comprimento (formato IEEE488.2):
#42000...
PARÂMETROS: nenhum
EFEITOS_COLATERAIS: nenhum
VALORES DE RETORNO: 0 se bem sucedido
1 se houve algum erro
****************************************************************************/
{
if (write_to_analyzer("FORMAT REAL32;:TRAC? TRACE1")) // envia informação do Traço
1 em formato binário
{
sprintf(error_msg, "IEEE-Error: TRAC? TRACE1");
return 1; // houve erro
}
if (read_from_analyzer(sweep_data, MAX_NOF_DATA_BYTES))
{
sprintf(error_msg, "IEEE-Error: reading sweep data");
return 1; // houve erro
}
if ( (ibcnt < 2006) || (ibcnt > 2007) ) // número de bytes recebidos
{
sprintf(error_msg, "IEEE-Error: leitura de dados de varredura (contagem de bytes incorreta)");
return 1; // houve erro
}
sweep_data_ptr= (float *) &sweep_data[6]; // definir ponteiro para início de dados
return 0;
}