하이퍼 터미널과 상호 작용하는 장치를 제어하는 기본 드라이버를 작성하려고합니다. 모든 입력은 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
하이퍼 터미널 의미 RS232? http://www.varesano.net/blog/fabio/serial%20rs232%20connections%20python – Novikov
문제는 서식 지정 중입니다. 장치는 항상 하이퍼 터미널과 상호 작용한다고 가정하기 위해 하드 코딩되어 있으므로 출력에 정크 톤이 있고 모든 곳의 버퍼에 과도한 데이터가 있습니다. 필자는 필터링 작업을 충분히 수행하지 못하고 있습니다. 주기적으로 예외. 하이퍼 터미널 표준은 내가 찾을 수있는 한 잘 문서화되어 있지 않습니다. – Elliot
하이퍼 터미널을 완전히 무시할 수있는 방법이 있거나이를 위해 설정된 패키지가 있다면 더 좋을 것입니다. – Elliot