2013-02-23 120 views
1

我編寫了一個Arduino來串行發送數據到我的電腦。 pySerial正在從串口中正確讀取,但由於我總是希望獲得最新的信息,因此我認爲我可以使用flushInput()來刷新輸入緩衝區,但是當命令執行時,我不能再讀取串行。我只嘗試每次掃描51次(因爲51是一個素數,我可以很容易地用計數器計數51次而不必重置),這樣Arduino就有足夠的時間發送下一個數據包(運行在57600波特率),但仍然無法正常工作。也就是說,我使用了一個變量來存儲使用deadline()的讀取行的長度,但是,一旦我打到51並且輸入緩衝區被刷新,我總是得到0的讀數,這意味着它沒有讀取任何東西。我已經閱讀了pySerial的文檔,但還沒有找到任何相關信息。 flushInput()是否終止了串行連接?非常感謝。當我在Python中刷新串行緩衝區時,它停止讀取

編輯:我運行Mac OS 10.7.5和Python 2.7.3

try: 
    self.s = serial.Serial("/dev/tty.usbmodemfa131", 57600, timeout = 0) 
    self.FlightLoopCB = self.FlightLoopCallback 
    XPLMRegisterFlightLoopCallback(self, self.FlightLoopCB, self.interval, 0) 
except serial.SerialException: 
    self.s = None 
    . 
    . 
    . 

    self.length=0 
    self.myline=self.s.readline() 
    self.length=len(self.myline) 
    print "Test: %i %i" % (self.length, self.j) 
    if(self.length>=7): 
     if(self.myline[0:2]=="R,"): 
      if(self.j%51==0): 
       self.s.flushInput() 

      self.length=len(self.myline) 
      self.myline=self.myline[2:6] 
      self.myLineBytes=[0,0] 

      self.myLineBytes[0]=unpack('>H', self.myline[0:2]) 
      self.myLineBytes[1]=unpack('>H', self.myline[2:4]) 
+0

你能發佈你的代碼嗎?或者至少是打開套接字並刷新輸入的部分? – entropy 2013-02-23 22:21:48

+0

PS:你在哪個平臺上運行這個(windows,linux,osx,別的...)?由於pySerial代碼不同,這可能是顯着的 – entropy 2013-02-23 22:23:48

+0

@entropy我編輯了這篇文章。 – Gepapado 2013-02-24 19:19:17

回答

8

是否Serial.flushInput()也關閉流?

因此,我深入研究了pySerial的代碼(它可用,you can pull it over SVN,我建議您如果遇到進一步的麻煩,可以試着弄清楚)。

由於您在OSX上,python會將os.name報告爲「posix」,因此serial.Serial實際上會解析爲serial.serialposix.Serial。的flushInput()該定義是:

def flushInput(self): 
    """Clear input buffer, discarding all that is in the buffer.""" 
    if not self._isOpen: raise portNotOpenError 
    termios.tcflush(self.fd, TERMIOS.TCIFLUSH) 

(如果你想看到它,這是here上線500)

所以基本上它只是一個包裝圍繞termios.tcflush()。該docs爲有這樣一段話:

termios.tcflush(FD,隊列)

放棄排隊的文件描述符fd的數據。隊列選擇器指定哪個隊列:輸入隊列的TCIFLUSH,輸出隊列的TCOFLUSH或兩個隊列的TCIOFLUSH。

根據docs那麼,它確實不是關閉底層流,只丟棄數據。這可能是你首先期待的行爲。

這使我想說,你的代碼可能還有其他問題。沒有足夠的發佈代碼來推斷出問題所在。

這只是一個猜測,但也許增量爲self.j的代碼在一個塊中,它在命中51後沒有被調用,所以你總是沖洗?如果你可以發佈一個完整的代碼示例來產生這個問題(也許一些簡化的代碼就可以解決你所看到的這個問題),那麼我可能會提供幫助。

PS - 對早產的優化A注:

除非無論是對串行接口的另一端產生的數據高得多的速度產生的數據比你消耗那麼就可能沒有必要首先沖洗,因爲不會在緩衝區中建立大量的數據。不知何故,我懷疑以57600波特率運行的串行接口將永遠無法做到這一點。在做之前,你應該首先檢查並確保沖洗實際上是需要的。

不要只因爲你認爲它可能是需要的或「只是爲了確保」。在做之前檢查它是否真的解決了問題,否則這是一個過早的優化,並且無緣無故地增加了代碼的複雜性和脆性。