2016-03-03 191 views
0

通過pySerial正確接收數據有點問題:它通常不會讀取完整的數據或太多的數據。有時並且有時候更常見的是,還有額外的字符或某些字符/部分的發送數據丟失。看來,PC和數據的發射器沒有正確同步。PySerial沒有正確接收數據

在我使用的Arduino當前示例中,發送的「Hello World」我的電腦的串口(操作系統是Ubuntu的14.04),用下面的簡單代碼:

void setup(){ 
    Serial.begin(9600); 
    Serial.print("Programme initiated\n"); 
} 

我用下面的python3代碼接收數據:

import serial 
import time 

arduino = serial.Serial(port, baudrate=9600, timeout=2) 
print(arduino.isOpen) 
print(arduino) 
time.sleep(1)  

while True: 
    print(arduino.readline()) 

這是非常簡單的教程例子,這裏是我收到(除了那些正確的東西):

b'PrProgramme initiated\n' 

b'PProgramme initiated\n' 

b'ProgProgramme initiated\n' 

b'ogramme initiated\n' 

我提出與我的代碼更復雜的問題,但我仍然沒有解決這個問題。當從arduino(標準hello world代碼)的循環中發送消息時,通常需要時間來穩定(雖然它再次只顯示數據的中間片段),然後運行非常穩定,但即使如此它有時會打破單行。

我在與萬用表設備通信時遇到同樣的困難。在那裏,它通常不會讀取第一個字符或與之前的數據混合在一起。

有沒有人遇到過這個問題?我認爲這是一個同步問題,但我不知道如何解決它。而令我感到困惑的是,我真的只使用了教程,並且它似乎不能正常工作。或者它是我的電腦的配置問題?

回答

1

由於發生了一些不同的事情,您正在看什麼。

首先,每次打開串口時,都會導致所謂的「自動復位」和Arduino重新啓動。這可以通過硬件或者通過明確禁用RST信號打開來避免。如何做到這一點可能會有所不同,並超出了問題的範圍。

然後我們必須明白,串口不會等待另一部分監聽發送數據;所以如果你禁用自動復位並連接到Arduino,你應該看到程序輸出的隨機部分,取決於它的當前狀態。

最後,我們在PC上有一些緩衝能力(有時甚至在UART到USB端),所以它不是真的,如果你沒有聽數據丟失,它可能仍然在緩衝區。

我們可以說,前3個工件可以通過緩衝數據+重新啓動(當您發送大量數據時發生很多事情,並且打破代碼的自動載入並且您必須執行手動過程),同時最後一個可能會阻止緩衝區填充,也許它被你禁用,也許一些奇怪的時間打開序列,也許你禁用了自動復位,也許是時間arduino列舉消息的一部分消失了。

+0

感謝您的解釋。總的來說,在通信開始之前是否有辦法清除緩衝區(解決第3點)? – kire

+0

嘗試使用 arduino.flushInput() 剛剛打開 – Lesto