2016-04-17 8 views
1

Ich bin noch neu in Python und Instrument-Controlling und ich habe einige Probleme, auf die ich noch keine Antworten finden konnte. Ich benutze PyVisa, um einen Monochromator (Spectral Products dk240) über RS232 zu steuern. (Python 3.5, PyVisa 1.8)PyVisa lesen Timeout

Ich kann Befehle schreiben und die Antwort lesen, indem ich das richtige Beendigungszeichen einstelle. Das Problem ist, dass manchmal die Geräteantwort ein einzelnes Byte ohne Terminierung ist, und dann bekomme ich ein Timeout (obwohl ich die Antwort sehe, die ich auf einem Port-Monitor haben möchte).

Ich habe versucht, read_raw zu verwenden, um das einzelne Byte zu bekommen, aber es funktioniert nicht. Hier ist eine einfache Version von meinem Code:

import pyvisa 
rm = pyvisa.ResourceManager() 
instrument = rm.open_resource('ASRL1::INSTR') 
instrument.baud_rate= 9600 
instrument.data_bits=8 
instrument.stop_bits = pyvisa.constants.StopBits.one 
instrument.parity = pyvisa.constants.Parity.none 
instrument.read_termination = chr(24) #specified in the manual 

instrument.write(chr(33)) # command to get the serial number 
instrument.read()   # this works! 

instrument.write(chr(27)) # echo command 
          # instrument replies one byte echo (seen on port monitor) 
instrument.read_raw(1)  # I get a timeout here 

und der Fehler:

raise errors.VisaIOError(ret_value) 
pyvisa.errors.VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed. 

Ich habe auch versucht zu „none“ das Abschlusszeichen zu setzen, so Visum für sie nicht warten würde, aber immer noch bekomme die Zeitüberschreitung. Zusätzlich habe ich versucht, die Seriennummer mit read_raw (1) zu lesen, aber anstelle von einem Byte bekomme ich die volle Antwort vom Instrument, warum ist das?

jede Hilfe wird sehr geschätzt werden !!!

Antwort

1

Es ist wahrscheinlich ein wenig spät dafür, aber ich habe mir selbst geholfen, während ich dieses Problem mit einer eigenen Funktion hatte, die vom Attribut Bytes_in_buffer abhängig ist.

def read_all(devicehandle): 

    with devicehandle.ignore_warning(constants.VI_SUCCESS_DEV_NPRESENT, constants.VI_SUCCESS_MAX_CNT): 

     try: 
      data , status = devicehandle.visalib.read(devicehandle.session, devicehandle.bytes_in_buffer) 
     except: 
      pass 
    return data 

Anmerkung: es funktioniert nicht mit Ethernet-Verbindungen. Das Attribut ist nicht vorhanden.