2013-11-09 76 views
0

我想間隔讀取串行端口上的數據和Arduino。所以基本上像讀取串行端口 - 忽略寫入串行端口一段時間的數據部分

  1. 進行讀數
  2. 等待
  3. 進行讀數
  4. 等待
  5. 以...

我的問題面對的是,當我呼叫等待f時,端口將緩衝其信息串口上的數據將開始緩衝。一旦等待函數完成,我嘗試再次讀取數據,但是我從緩衝區的開始處讀取數據,並且數據不再是當前數據,而是大致在等待函數開始時讀取的數據。

我的問題是,是否有一種方法,我不知道在等待期間忽略讀入的數據部分,只讀取當前串行端口上的數據?

我有這樣的事情類似於這個至今:

import serial 

s = serial.Serial(path_to_my_serial_port,9600) 

while True: 
    print s.readline() 
    time.sleep(.5) 

爲了便於說明我有Arduino的輸出時間,因爲它開始了它的循環。通過python代碼,每次調用的時間應該相差半秒。通過串行輸出,時間在不到一毫秒的時間內遞增。無論睡眠時間如何,這些值都不會改變。

輸出示例:

504 

504 

504 

504 

505 

505 

505 

... 

作爲自己的最終目標的想法,我想衡量港口的價值,等待時間延遲,看到價值是什麼,然後,等待再次,看什麼那麼值是,再等一等。

我目前正在使用Python,但我對其他語言開放。

回答

3

如果您想在執行下一次讀取之前刪除輸入緩衝區中的內容,可以使用s.flushInput()刷新輸入緩衝區(也可以使用s檢查輸入緩衝區中的字節。在等待中())。

因此,增加沖洗通話將確保你讀任何字節從那個時候到:

while True: 
    s.flushInput() 
    print s.readline() 
    time.sleep(.5) 

您可能還需要考慮使用讀超時(當你創建serial.Serial對象,帶有超時參數)。在這種情況下,如果發生超時,您需要處理空的讀數,但是您可以保證,如果發送方因任何原因而停止工作,讀者將不會永遠等待。

+1

這正是我所要求的,但是因爲我提出了這個問題,我試過這個,發現它經常會把我寶貴的數據截斷一半!我想出了一個適合我的目的的替代解決方案。儘管謝謝你的回覆。 –

1

你想要做的事很有可能。但是,您需要考慮(並解決)各種競爭條件。當Python代碼正在休眠時,Arduino可能會開始/完成發送數據。這可能正是你所希望的。但是,在Python代碼運行時,Arduino可能也會開始發送數據。各種各樣的重疊情況可能會發生。

在我看來,readline()沒有你想象的那麼有用。當然,readline()將返回一行。但是,它可能只返回一行的最後一部分。第一部分(取決於時間)可能會被刷新。

我的建議是使來自Arduino自我記錄的數據流(字節)。換句話說,像<value>這樣的值,其中value是您實際需要從Arduino獲取的數據。

的Python代碼可能是這樣的

while True: 
# 
# Loop reading for a '<' character. Skip everything until you get a '<'. 
# 
    while True: 
    if s.inWaiting() > 0: 
     c = s.read() 
     if c == '<': 
     break 
# 
# Read the actual data value. Stop when we get to a '>'. 
# 
    value = '' 
    while True: 
    if s.inWaiting() > 0: 
     c = s.read() 
     if c == '>': 
     break 
     value = value + c 
# 
# We now have the value we actually care about. However, there might 
# be more data in the buffer. If the buffer is now empty we are done. 
# If the buffer is not empty, then we need to start over. 
# 
    if s.inWaiting() == 0: 
    break 

的總體思路應該是清楚的。從輸入 流中讀取完整的完整值,直到輸入流爲空。如果您恰巧在 輸入流包含不完整的值時開始讀取,Python代碼將自動重新同步 。

讓我爲任何和所有的Python編碼錯誤表示歉意。我的Python很生鏽。

+0

這是一個很好的建議,但並不能解決我的問題......我的問題並不是處理比賽情況,而是更多地尋找在「休息」期間忽略輸入數據的準確方法。 –

+0

我的意圖在於提供上述代碼是雙重的。代碼應該消耗(並因此忽略)「休息」週期中積累的所有數據,並防止將最後一位數據分成兩半。我知道你找到了一個不同的解決方案。什麼對你有用? –

+0

我通過分析後面的數據而不是在讀取序列期間找到了解決方法。這樣我就可以記錄一切,不必擔心無關的數據和等待時間。 –