首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python串行通信

Python串行通信
EN

Stack Overflow用户
提问于 2011-05-19 00:55:24
回答 2查看 23.5K关注 0票数 9

我正在开发一个Arduino项目,由于内存限制,我将其与Python脚本进行交互。在Python端,我有一个二维矩阵,包含各自的x,y坐标值,在这个列表中有26000个坐标对。所以,为了给大家弄清楚数据结构,pathlist[0][0]将返回我列表中第一个坐标的X值。在Python中对此列表执行不同的操作等不会造成任何问题。然而,我遇到麻烦的地方是通过串行将这些值发送到Arduino,以一种有用的方式。

由于串行通信的性质(至少我认为是这样),我必须将每个整数作为字符串发送,并且一次只能发送一个数字。因此,像345这样的数字将作为3个单独的字符发送,这些字符当然是3、4,然后是5。

我正在努力的是找到一种在Arduino上重建这些整数的方法。

每当我发送一个值时,它接收数据并输出数据,如下所示:

代码语言:javascript
复制
  //Python is sending over the number '25'
  2ÿÿ52
  //Python is sending the number 431.
  4ÿÿ321ÿÿÿ2

Arduino代码是:

代码语言:javascript
复制
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代码如下所示:

代码语言:javascript
复制
 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,结果将如下所示:

代码语言:javascript
复制
//For input 271.
2ÿÿ771ÿÿÿ7

在我看来,Arduino正在将值分成两对,并将长度附加到末尾。我不明白为什么会发生这样的事情。

在我看来,ÿ似乎也被添加到了for循环中。这意味着添加它们是因为在当前时刻没有发送任何内容。但是,即使通过添加另一个if(Serial.available()>0)条件来解决这个问题,结果仍然不会被视为整数。

另外,在这里使用Pickle合适吗?我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-19 01:22:01

您应该等待一段时间,以等待串行数据到达。

Arduino代码应该是:

代码语言:javascript
复制
if (Serial.available()){
    delay(100); // Wait for all data.
    while (Serial.available()) {
        char d = Serial.read();
        str.concat(d);
    }
}

此外,在重新使用字符串之前,您必须清除它。

编辑

我忘了提到,== -1,== 255,意思是Serial.read(),它说它不能读取任何东西。

票数 5
EN

Stack Overflow用户

发布于 2011-05-24 02:18:19

我会改变通信方式,让python在数字之间发送换行符,这样你就不会像以前那样依赖于时间了:

代码语言:javascript
复制
s.write(str(25)+'\n')

然后在接收端:

代码语言:javascript
复制
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);
        }
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6048270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档