Управление устройством, которое взаимодействует только через Гипертерминал, используя python - PullRequest
1 голос
/ 02 февраля 2011

Я пытаюсь написать базовый драйвер для управления устройством, которое взаимодействует только с гипертерминалом. Все входные данные ожидают HT-форматированные данные, и все возвращаемые значения содержат обильные знаки равенства, новые строки и пробелы, чтобы получить правильное форматирование для визуализации человеком. Я почти уверен, что возвращение создает проблемы, так как я часто выкидываю исключения, но я не уверен, как еще я могу справиться с этим. Кто-нибудь знает лучший способ сделать это?

Руководство по эксплуатации: 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

1 Ответ

0 голосов
/ 02 февраля 2011

В HiperTerminal нет ничего особенного.Символ конца строки обычно '\r\n' или '\n' один.

...