how solve custom start block problem with pyvisa

53 Views Asked by At

I try to get data from spectrometer Jeti gmbh in byte mode.

but cannot extract data in binary form. is here way specify custom start block?

structure of data 1

my code:

import pyvisa

def start(cr):
    resource_manager = pyvisa.ResourceManager()
    device_0 = resource_manager.list_resources()
    jeti = resource_manager.open_resource(device_0[0], read_termination=cr,
                                          baud_rate=115200,  # send_end=True, # open_timeout=3000,                                   
                                          )
    jeti.clear()
    return jeti


def collect_responses(jeti):
    exposue_tint = 0.01  # ms
    av = 1  # average spectras
    format_scpi = 1

    visa_res = jeti.query_binary_values(f"*MEAS:LIGHT {exposue_tint} {av} {format_scpi}",
                                        datatype='f', is_big_endian=False, header_fmt='ieee')

    print(visa_res)
    return visa_res


if __name__ == "__main__":
    cr = '\r'  # carriage return
    jeti = start(cr)

    response = collect_responses(jeti)

    jeti.close()  

I think starter block is "\x06\x07"

if I use "header_fmt='ieee'", below:

! UserWarning: The beginning of the block has been found at 624 which is an unexpectedly large value. The actual block may have been missing a beginning marker but the block contained one: bytearray(b'\x06\x07\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\'\x00\x00\x00\t\x00\x00\x00-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x1b\x00\x00\x00#\x00\x00\x00\x04\x00\x00\x00\n\x00\x00\x00\r') warnings.warn(msg, UserWarning) !

win 10

python 3.9

pyvisa 1.13.0

With ASCII it work, but consume more time than I would like to have

def collect_responses(visa_res):
    res_s = []
    while True:
        try:
            res = visa_res.read().split("\t")[1]
        except:
            break
        res_s.append(res)

    return res_s
format_scpi = 2
jeti.write(f"*MEAS:LIGHT {exposue_tint} {av} {format_scpi}")
response_s = collect_responses(jeti)

ASCII format

1

There are 1 best solutions below

0
Toedsjgewg On

finded solution execution time with read_bytes: 0,02 sec

code:

import pandas as pd
import pyvisa
import plotly.express as px

def start(cr):
    resource_manager = pyvisa.ResourceManager()
    device_0 = resource_manager.list_resources()
    jeti = resource_manager.open_resource(device_0[0], read_termination=cr,
                                          baud_rate=115200, send_end=False,
                                          # open_timeout=3000,
                                          )
    jeti.clear()
    return jeti


def collect_responses(jeti):
    exposue_tint = 0.1  # ms
    av = 1  # average spectras
    format_scpi = 1

    jeti.write(f"*MEAS:LIGHT {exposue_tint} {av} {format_scpi}")
    command_sended = jeti.read_bytes(1)
    result_sended_to_pc = jeti.read_bytes(1)
    number_pixel_detector = jeti.read_bytes(2)
    print(command_sended, result_sended_to_pc, number_pixel_detector)

    c = jeti.read_bytes(2 * 4096)
    decoded = bytes_to_human_readable(c)
    print(decoded)

    return pd.DataFrame(decoded)


def bytes_to_human_readable(raw_bytes):
    num_words = len(raw_bytes) // 2

    words = []

    for i in range(num_words):
        low_byte = raw_bytes[i * 2]
        high_byte = raw_bytes[i * 2 + 1]
        word = (high_byte << 8) | low_byte
        words.append(word)

    return words


if __name__ == "__main__":
    cr = '\r'  # carriage return
    jeti = start(cr)

    response = collect_responses(jeti)
    print(response, len(response))

    fig = px.line(x=response.index, y=response[0])

    fig.write_html("test.html", auto_open=True)

    jeti.close()