2011-02-02 3 views
1

하이퍼 터미널과 상호 작용하는 장치를 제어하는 ​​기본 드라이버를 작성하려고합니다. 모든 입력은 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 
+0

하이퍼 터미널 의미 RS232? http://www.varesano.net/blog/fabio/serial%20rs232%20connections%20python – Novikov

+0

문제는 서식 지정 중입니다. 장치는 항상 하이퍼 터미널과 상호 작용한다고 가정하기 위해 하드 코딩되어 있으므로 출력에 정크 톤이 있고 모든 곳의 버퍼에 과도한 데이터가 있습니다. 필자는 필터링 작업을 충분히 수행하지 못하고 있습니다. 주기적으로 예외. 하이퍼 터미널 표준은 내가 찾을 수있는 한 잘 문서화되어 있지 않습니다. – Elliot

+0

하이퍼 터미널을 완전히 무시할 수있는 방법이 있거나이를 위해 설정된 패키지가 있다면 더 좋을 것입니다. – Elliot

답변

0

HiperTerminal에 대한 특별한 것은 없습니다. 줄 끝 문자의 길이는 일반적으로 '\r\n' 또는 '\n'입니다.

+0

정보가 처리되는 방식이 무작위로 죽을 수 있습니다. – Elliot