Python串口通信

标签 python arduino serial-port pyserial

我正在开发一个 Arduino 项目,由于内存限制,我正在将它与 Python 脚本连接起来。在 Python 方面,我有一个二维矩阵,其中包含坐标的相应 x、y 值,在此列表中有 26000 个坐标对。因此,为了向大家阐明数据结构,pathlist[0][0] 将返回我的列表第一个坐标的 X 值。在 Python 中在此列表上执行不同的操作等不会造成任何问题。然而,我遇到麻烦的地方是以一种有用的方式通过串行将这些值发送到 Arduino。

由于串行通信的性质(至少我认为是这种情况),我必须将每个整数作为字符串发送,并且一次只能发送一个数字。因此,像 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在这里合适吗? 我做错了什么?

最佳答案

您应该等待串口数据到达。

Arduino 代码应该是:

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

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

[编辑]

我忘了提到 ÿ == -1 == 255 这意味着 Serial.read() 它说它无法读取任何内容。

关于Python串口通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6048270/

相关文章:

python - 如何从 Python 中的 stdout 中删除行 - 在 SciTe、Idle、Eclipse 或其他带有控制台的编辑器中

python - ast.fix_missing_locations 何时更改树?

python - 调用了错误的 python 解释器

c++ - 错误 : 'null' was not declared in this scope when setting integer to 0 - photon/arduino C++

serial-port - 监视串行端口通信

python - 使用作为输入输入的后缀命名输出变量

IOS 和 AsyncUDPSocket - 教程?

c - linux从串口读取

windows - 如何仅读取 Windows COM 端口上的可用数据?

c++ - 结构数组的初始化