2013-10-18 132 views
10

我正在嘗試使用python從arduino中讀取電位器值。但我的串行讀取值很奇怪。Python不能從arduino串行輸出中讀取正確的值

Python代碼:

import serial 

ser = serial.Serial('COM12') 

print ("connected to: " + ser.portstr) 
count = 1      

while True: 
    for line in ser.read(): 
     print(str(count) + str(': ') + str(line)) 
     count = count + 1 


ser.close() 

的Arduino代碼:

int potpin = 0; // analog pin used to connect the potentiometer 
int val = 0;  // variable to store the value coming from the sensor 
int oldVal = 0; // used for updating the serial print 

void setup() 
{ 
    Serial.begin(9600); 
} 

void loop() 
{ 
    val = analogRead(potpin);    
    val = map(val, 0, 1023, 0, 179);  

    if(val != oldVal) 
    { 
    Serial.print(val);   // print the value from the potentiometer 
    oldVal = val; 
    } 

    delay(100); 
} 

一些Python的輸出: 這個輸出來自電位器上的直線,緩慢的增長,我從來沒有拒絕了,在任何時候。

1: 56 
2: 57 
3: 49 
4: 48 
5: 49 
6: 49 
7: 49 
8: 50 
9: 49 
10: 51 

當我運行arduino串行終端時,我得到範圍從0-179的值。爲什麼Python不從串口獲取正確的值?

感謝

編輯:

解決的問題。 48-55是1-9的ascii值,所以它是改變python代碼打印字符而不是值的問題。然而,這會導致另一個問題,即打印個別數字。例如,數字「10」作爲單個「1」和「0」出現。這可以通過在Arduino草圖中使用Serial.write而不是Serial.print來解決。這也意味着你將會收到一個字節,它是你的數字而不是數字的ascii值,所以你不需要將讀取行從一個值轉換爲ascii。

希望這會有所幫助。

+1

+1用於發佈您的源代碼,併發布您找到的解決方案。 – jwygralak67

+20

您可以將解決方案作爲答案發布,然後接受您自己的答案,而不是用答案編輯您的問題。這讓人們很清楚地發現有問題的解決方案。 – Craig

回答

2

讓我試着提供一些可能對其他有類似問題的人有幫助的評論(即使這個問題已經解決了)。首先,嘗試使用串行監視器運行幾次Arduino草圖。您可以在IDE菜單的工具下找到串行監視器。您也可以鍵入Ctrl-Shift-M來調用串行監視器。

看看出現了什麼。如果您的草圖嘗試通過Serial.print()發回數據,它經常會非常有幫助。幾個筆記。確保串行監視器內設置的波特率與草圖中的波特率完全一致(9600幾乎適用於所有情況)。

第二個注意事項非常重要。調出串行監視器強制在Arduino板上重置。你的素描開始(總是)。這是一件好事,因爲它每次都會讓你重新煥然一新。請注意,只需將波特率設置爲9600(即使它已經是9600),您也可以強制重置。這使您可以在串行監視器內運行多個測試,而無需每次都重新啓動串行監視器。

至於你原來的問題,你應該可能有某種數據分隔符。例如,您可以發送像< 53>這樣的值。在Python中,您將掃描'<',然後繼續閱讀數字,直到獲得'>'。這將允許多個數字作爲一個數字值發送。