2011-05-18 77 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); 
     } 
    } 
}