2013-08-08 2 views
1

목표는 작동하는 직렬 포트에서 읽는 것이지만 RFID 판독기이기 때문에 사용자가 다른 읽기가 버퍼되기 전에 시간 내에 이동할 수 없습니다. 중복 된 (또는 그 이상) 항목이 생성됩니다. 따라서 버퍼링 된 항목을 지우고 잠시 기다려야합니다.twisted python : 직렬 포트 일시 중지 읽기

질문은 수면 기능을 구현하고 입력 버퍼를 비우는 '꼬인'방법은 무엇입니까?

class ReaderProtocol(LineOnlyReceiver): 

    def connectionMade(self): 
     log.msg("Connected to serial port") 

    def lineReceived(self, line): 
     line = line.decode('utf-8') 
     log.msg("%s" % str(line)) 
     time.sleep(2) # pauses, but still prints whats in buffer 

... 
log.startLogging(sys.stdout) 
serialPort = SerialPort(ReaderProtocol, "/dev/ttyAMA0", reactor, 2400) 
reactor.run() 

EDIT : 여기

은 작동 용액

class ReaderProtocol(LineOnlyReceiver): 

    t, n = 0, 0 

    def __init__(self): 
     self.t = time.time() 

    def connectionMade(self): 
     log.msg("Connected to serial port") 

    def lineReceived(self, line): 
     self.n = time.time() 
     if self.n > self.t + 2: 
      line = line.decode('utf-8') 
      log.msg("%s" % str(line)) 
      self.t = self.n 

... 
log.startLogging(sys.stdout) 
serialPort = SerialPort(ReaderProtocol, "/dev/ttyAMA0", reactor, 2400) 
reactor.run() 
+0

두 번째 줄부터 마지막 ​​줄까지는''serialPort = SerialPort (ReaderProtocol(),/dev/ttyAMA0 ", reactor, 2400)''즉 클래스를 인스턴스화해야합니다. 그렇지 않으면 전혀 작동하지 않습니다 – stff00

답변

2

할 수 없다 "플러시"입력 버퍼이다. 플러시는 사용자가 쓰기 위해 수행하는 작업입니다. 즉, 출력은 버퍼입니다. 당신이하려는 것은 특정 시간 프레임 내에 도착하는 반복되는 메시지를 무시하는 것입니다.

그럼 왜 그렇게하지 않습니까?

"버퍼"로 이상한 일을 시도하지 마십시오. 마지막 메시지를받은 후 얼마나 오랫동안 메시지를 처리했는지 만 변경하십시오.

time.sleep()으로 전화를 걸면 전체 프로그램이 조금만 멈추게되므로주의해야합니다. 직렬 포트의 메시지는 계속 백업됩니다.

+0

좋은 대답이지만, 어떤 사람들은 당신이 입력 버퍼를 플러시 할 수 있다고 느낍니다. 예를 들어,'tcflush (..., TCIFLUSH)':) –

+0

이 전략을 취해야 할 것처럼 보입니다. 이미 대기중인 메시지를 지우고 더 이상 들어오지 못하게하는 방법이 있는지 궁금합니다. 감사합니다. –

+0

카드를 바꾸면 이전 카드를 계속 가져오고 있기 때문에 여전히 경쟁 조건이있는 것으로 보입니다. 그것이 이것과 관련이 있는지 알 수 없습니다. –