2011-05-18 111 views
9

我正在開發一個Arduino項目,並且由於內存限制,我將它與Python腳本連接起來。在Python方面,我有一個2維矩陣,它包含座標各自的x,y值,並且在這個列表中有26000個座標對。因此,爲了澄清你們所有人的數據結構,pathlist[0][0]將返回我列表的第一個座標的X值。在Python這個列表中執行不同的操作等沒有任何問題。然而,我遇到麻煩的地方是,通過串行方式將這些值發送給Arduino,這種方式非常有用。Python串行通信

由於串行通信的性質(至少我認爲是這種情況),我必須將每個整數作爲一個字符串發送,並且一次只發送一個數字。所以,像345這樣的數字將作爲3個單獨的字符發送,當然是3,4個,然後是5個。

我正在努力尋找一種方法來重建Arduino上的整數。

每當我送過來的值,它接收數據並像這樣將其輸出:

//Python is sending over the number '25' 
    2ÿÿ52 
    //Python is sending the number 431. 
    4ÿÿ321ÿÿÿ2 

Arduino的代碼是:

String str; 
int ds = 4; 

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

void loop(){ 
    if (Serial.available()>0) { 
     for (int i=0; i<4; i=i+1) { 
      char d= Serial.read(); 
      str.concat(d); 
     } 

     char t[str.length()+1]; 
     str.toCharArray(t, (sizeof(t))); 
     int intdata = atoi(t); 
     Serial.print(intdata); 
    } 
} 

而Python代碼如下所示:

import serial 

s = serial.Serial(port='/dev/tty.usbmodemfd131', baudrate=9600) 

s.write(str(25)) 

我幾乎可以肯定,問題不是源於輸出方法(Serial.print),看到當我聲明另一個int時,它的輸出格式很好,所以我假設問題在於如何構造intdata變量。

可能有助於診斷此問題的一件事是,如果我將Serial.print(intdata)更改爲Serial.print(intdata+5),我的結果是2ÿÿ57,其中我期望30(25 + 5)。無論輸入如何,這7個都存在。比如我可以寫271到串行和我的結果將如下所示:

//For input 271. 
2ÿÿ771ÿÿÿ7 

這在我看來,Arduino是分塊的值到對兩個附加的長度到底。我不明白爲什麼會發生。

在我看來,ÿ被加入for循環。這意味着他們被添加,因爲當前沒有任何內容正在發送。但即使通過添加另一個if(Serial.available()>0)條件來修復,結果仍不會像整數那樣處理。

另外,會用Pickle在這裏適合嗎? 我在做什麼錯?

+0

這是爲什麼標籤'java'? – NPE 2011-05-18 17:07:45

+0

@aix嗯,我認爲Arduino是基於Java的,因此Java的知識將適用於它。如果我錯了,我很樂意改變它:D – danem 2011-05-18 17:12:21

+1

這只是恰好是用Java編寫的Arduino IDE。你在Arduino上運行的代碼是C語言,所以Java與這個問題無關。 – NPE 2011-05-18 17:15:27

回答

5

您應該等待一點點以便串行數據到達。

Arduino的代碼應該是:

if (Serial.available()){ 
    delay(100); // Wait for all data. 
    while (Serial.available()) { 
     char d = Serial.read(); 
     str.concat(d); 
    } 
} 

你也需要再次使用它之前清除您的字符串。

[編輯]

我忘了提ÿ== -1 == 255,這意味着Serial.read()它說,它不能讀什麼。

+1

Gah。我覺得這是一個簡單問題的不必要的複雜的帖子。嘿,我覺得很傻。它的工作原理!非常感謝,我真的很感激它。 – danem 2011-05-18 17:26:55

+0

然而,我遇到的一個問題是,當我嘗試在我的巨型座標列表上使用它時,它失敗了。例如,如果我只是發送了第一個40 x和y val,我會得到'-5062'的結果。我是用輸入還是其他東西來重載它? – danem 2011-05-18 17:39:14

+0

我曾經遇到過這個問題。我認爲這是因爲當你發送大量數據時,Arduino可能沒有結束循環(注意我通過調用delay來增加額外的100ms到處理時間)。一種解決方案是添加一個結束行字符並處理該循環,直到它到達。 – JBernardo 2011-05-18 17:44:39

5

我會改變通信使蟒蛇號碼之間發送換行符,所以你還不如依賴於時間:

s.write(str(25)+'\n') 

,然後在接收端:

void loop(){ 
    while (Serial.available() > 0) { 
     char d = Serial.read(); 
     if (d == '\n') { 
      char t[str.length()+1]; 
      str.toCharArray(t, (sizeof(t))); 
      int intdata = atoi(t); 
      Serial.print(intdata); 
      str = String(); 
     } 
     else { 
      str.concat(d); 
     } 
    } 
}