2014-12-23 171 views
1

我真的很抱歉在一天中詢問另一個問題。Python:serial.readline() - 如何定義從 n到 n n的EOL

詳細的新問題: 我把來自HOKUYO的激光測距儀連接到我的RaspBerryPi上。

連接等作品發現,由於serial.py

我唯一的問題IST,德恩我發送一個命令,我得到迴音和時間戳+ \ N回。

,緩衝區中的數據如下所示:

MD000007200001\n 
2Dh1\n 
\n\n 

在此之後,傳感器發送測量,其鎖定狀

MD000007200001\n 
2Dh1\n 
0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C\n 
0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C\n 
0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C\n 
0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C\n 
..... 
... 
0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C\n 
\n\n 

讀取這些數據,此刻我使用readall ()。還嘗試了readlines()。在這兩種情況下,我都遇到了這個問題,必須等到超時後設置爲1. 這需要花費太多時間來處理實時應用程序,事實上這個傳感器可以每隔120ms測量一次。如果我將超時設置爲0,我經常會錯過一些數據,並且一切都崩潰了,因爲我需要整個數據集來進行計算。

我還讀到,有一個選項可以將readline的EOL設置爲readline(eof ='\ n \ n'),但是對於Python 3.x,這不起作用。

似乎有第二個選項,寫我自己的readline函數。

但我是一個絕對的Python初學者。所以我不知道我應該從哪裏開始。

顯然有一些額外的選擇。

最好的問候,A.

+0

SHD很容易適應在http://stackoverflow.com/questions/16470903/pyserial-2-6-specify-end-of-line-in-readline的答案 - 那些正在尋找的'的EOL \ r',你正在尋找'\ n \ n',但是否則它看起來是同樣的問題。你需要更全面的闡述嗎? –

+0

那會很酷,是的。 我已經閱讀了答案,但無法實現我自己的readline()函數; – AndyA

回答

2

適應在pySerial 2.6: specify end-of-line in readline()答案(也提供替代品),一個可以編寫一個函數,例如:

def readline(a_serial, eol=b'\n\n'): 
    leneol = len(eol) 
    line = bytearray() 
    while True: 
     c = a_serial.read(1) 
     if c: 
      line += c 
      if line[-leneol:] == eol: 
       break 
     else: 
      break 
    return bytes(line) 

a_serial必須是serial.Serial例如使用合適的參數建造,當然 - 例如, ,None的默認timeout可能會導致此問題無限期地阻止,如果所需的eol標記不存在。如果我正確地閱讀這個問題,這對於OP來說似乎不是問題,但是,它在一般情況下需要注意的是

+0

Thx,就是這樣。 似乎我錯誤地理解了pySerial 2.6的答案:在readline()中指定行結束符。我想我必須從pyserial庫中更改現有的函數readline。 – AndyA

+0

不錯的解決方案!這對我很好。 – bretcj7

0

你應該設置超時0.12(或任何你想使「實時」),並使用readall()。然後,你有多種選擇:如果你想同時\n\n\n計算作爲分隔符,則調用數據replace("\n\n", "\n")readall()並通過調用split("\n")將其劃分成線自己

  1. 如果您只想將\n\n作爲分隔符計算,請致電的數據split("\n\n")
+0

這個信息,但重點是,我不想要任何時間依賴; 最好的方法是,當有可能用readline從緩衝區中讀取時,直到\ n \ n。 – AndyA

+0

那麼請將'timeout'設置爲0.請參閱文檔:http://pyserial.sourceforge.net/pyserial_api.html#serial.Serial.__init__ –