Domanda

Sto cercando di scrivere un driver di base per controllare un dispositivo che interagisce solo con iperterminali. Tutti gli input si aspettano dati formati da HT e tutti i rendimenti includono abbonamenti pari, neo -linee e spazi per ottenere la formattazione corretta per la visualizzazione umana. Sono abbastanza sicuro che i ritorni stiano generando problemi, poiché sto lanciando molto eccezioni, ma non sono sicuro di come posso gestirlo. Qualcuno sa un modo migliore per farlo?

Manuale 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
È stato utile?

Soluzione

Non c'è niente di speciale in Hiperterminal. Il carattere di fine linea è di solito '\r\n' o '\n' solo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top