Pregunta

Estoy tratando de escribir un controlador básico para controlar un dispositivo que solo interactúa con HyperMinal. Todas las entradas esperan datos formados HT y todas las devoluciones incluyen copiosos signos iguales, nuevas líneas y espacios para obtener el formato correcto para la visualización humana. Estoy bastante seguro de que las devoluciones están generando problemas, ya que estoy lanzando mucho excepciones, pero no estoy seguro de cómo puedo manejarlo. ¿Alguien sabe de una mejor manera de hacer esto?

Manual del dispositivo: http://us.startech.com/media/products/pcm815shna/manuals/pcm815shna.pdf

import visa
import re


class iopower8(visa.SerialInstrument):
    #initialization
    def __init__(self,loc):
        visa.SerialInstrument.__init__(self,loc)
        self.term_chars = '\r' #set terminal characters
        self.write('\r\r') #start faux 'Hyperterminal'

    def on(self, bank, out):
        self.ask("on " + str(bank) + " " + str(out))
        for i in range (1,3):#read buffer into void to prevent issues
            try:
                self.read_raw()
            except(visa_exceptions.VisaIOError):
                self.buffer_clear()
                break
        return self.status(bank, out)

    def off(self, bank, out):
        self.ask("of " + str(bank) + " " + str(out))
        for i in range (1,3):#read buffer into void to prevent issues
            try:
                self.read_raw()
            except(visa_exceptions.VisaIOError):
                self.buffer_clear()
                break
        return self.status(bank, out)

    def status(self, bank, port): #enter bank and port # you want to check
        self.ask("st " + str(bank))
        result = 'Error' #send error message regardless
        for i in range (1,13):#all 12 lines need to be read out of the buffer to prevent issues later
            try:
                stuff = self.read()#read the line to a holding srting, and dump in void if wriong line to clear buffer
                if stuff.strip() == ('='*44):
                    break
            except(visa_exceptions.VisaIOError):
                break
        for i in range(1,9):
            try:
                stuff = self.read()#read the line to a holding string, and dump in void if wriong line to clear buffer.
                if i == port: #this offset will get you to the line with the relevant port's status
                    result = re.match('(.*?)(ON|OFF)', stuff) #regex to the find the on/off status
                    #convert to boolean
                    if result.group(2) == 'ON':
                        result = True
                    elif result.group(2) =='OFF':
                        result = False
                    else:
                        result = 'ERROR'
            except(visa_exceptions.VisaIOError):
                self.buffer_clear()
                break
        return result

    def buffer_clear(self): #in case of buffer jamming
        while True:
            try:
                self.read_raw()
            except(visa_exceptions.VisaIOError):
                break

    def all_on(self, bank):
        self.ask("on " + str(bank) + " 0")
        for i in range (1,3):#read buffer into void to prevent issues
            try:
                hold = self.read_raw()
            except(visa_exceptions.VisaIOError):
                self.buffer_clear()
                break

    def all_off(self, bank):
        self.ask("of " + str(bank) + " 0")
        for i in range (1,3):#read buffer into void to prevent issues
            try:
                self.read_raw()
            except(visa_exceptions.VisaIOError):
                self.buffer_clear()
                break
¿Fue útil?

Solución

No hay nada especial en HiperMinal. El carácter final de la línea suele ser '\r\n' o '\n' solo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top