2014-11-25 6 views
2

필자는 파이썬이 시리얼 포트를 통해 나를 읽도록 최대한 빨리 쓰려고합니다. 문제는 내가 빨리 쓰고 있으며 작동하지 않는다는 것입니다. 나는 문제가 직렬 버퍼를해야한다고 생각하고 필자의 입력 버퍼를 덮어 쓰고 있다고 생각한다. 입력 및 출력 버퍼를 늘릴 수 있습니까? 버퍼가 가득 차거나, 비어 있거나, 사용 중일 때를 알려주는 메소드 또는 함수 또는 플래그입니까? 내가 할 수파이썬 Pyserial 시리얼 버퍼

ser = serial.Serial(port=2,baudrate=28800, timeout = 1) 
#print ser 

ser.flushInput() #flush input buffer, discarding all its contents 
ser.flushOutput() #flush output buffer, aborting current output 
        #and discard all that is in buffer  


ON = ":00000008f8" 
PGMMEM0 = ":01f0000011FE" #program one memory location 

start = timeit.default_timer() 

for i in range(10): 

    ser.write(ON) 

    end = timeit.default_timer() - start 
    print end 

    ser.write(PGMMEM0) 

    end = timeit.default_timer() - start 
    print end 
+0

여기에 코드를 게시 할 수 있습니까? 당신을 도우려는 것이 훨씬 쉬울 것입니다! – Konstantin

+0

코드를 –

답변

1

예를 빨리 반복하고 이상이 두 명령을 전송하려합니다, 당신은 여전히 ​​전송 대기 얼마나 많은 데이터를 확인하기 위해 Serial.outWaiting() 방법을 사용할 수 있습니다.

반환하기 전에 내부 버퍼에 데이터를 추가하는 경우 정확히 Serial.write() 메서드가 어떻게 작동하는지 잘 모르겠습니다. 위와 같은 것이 필요하기 위해서는 위와 같은 방법이 필요하지만 다른 한편으로는 비 블로킹을 위해 nonblocking()이 있습니다. 다소 혼란 스럽습니다.

+0

으로 업데이트하면 inWait 및 outWait이 어떻게 작동하는지 설명 할 수 있습니까? 나는이 각각의 방법들이 어떻게 작동하는지 이해하지 못한다. –

0

문제는 전송 속도 때문일 수 있습니다. 당신은 모두 직렬 링크 파트너가 구성되어 있는지 확인하기 위해선, constructor의 전송 속도를 설정할 수 있습니다

ser = serial.Serial(baudrate=9600) 

작업이 작동 쓰기 후 지연, 당신은 예를 들어 시리얼 포트의 상호 작용에 대한 래퍼 클래스를 생성 할 수있는 경우 :

class RS232(object): 

    def __init__ (self): 
     self.ser = serial.Serial(port=2,baudrate=28800, timeout = 1) 

    def write(self,s): 
     self.ser.write(s) 
     time.sleep(0.5) 

myRS232 = RS232() 
myRS232.write('whatever') 
+0

처음 물건을 추가하는 것에 대해 유감스럽게 생각한다. 나는 더 빠른 것을 보내려고 노력하기 때문에 28800에 baudrate를 원한다. 쓰기 후에 0.5 지연을 추가해도 작동하지만 피하려고합니다. –

+0

더 낮은 속도를 선택하거나 지연을 지정하십시오 (파트너 장치가 처리 할 수 ​​있도록). 지연을 추가하고 '읽기'작업을 랩핑하고 래퍼를 호출 할 수 있습니다. – Konstantin

+0

가상 포트에서 지연이 발생하지 않고 작동하기 때문에 지연이 필요한 이유는 무엇입니까? 더 큰 입출력 버퍼를 만들 수 있습니까? 버퍼의 처리량이 너무 많아서 0.5 초의 지연이 발생하기 때문에 명령의 길이에 따라 더 길어질 수 있기 때문에 확인할 수있는 플래그가 무엇입니까? –