如何让 Arduino 从 Python 读取序列号?

How to get Arduino to read serial from Python?

具体问题

我正在尝试使用串口和 USB 电缆在 Python 脚本和我的 Arduino Pro Mini 之间进行通信。在 Python 中,我可以阅读 Arduino 所写的内容,但 Arduino 要么无法阅读 Python 所写的内容,要么正在以我无法处理的形式阅读它。最明显的表现方式是当我尝试将 Arduino 刚刚从 Python 读取的内容写入 Python 时。 Python.

中没有显示任何内容

当我在串行监视器中使用它时,我的 Arduino 草图似乎工作正常,即它可以读写,所以我怀疑它在 Python 端。这是什么原因造成的?

详情

我希望能够测试将 64 字节长的信息发送到我的 Arduino 的速度。为此,我编写了一个 Python 脚本,它应该能够定期向我的 Arduino 发送各种信息。我可以改变周期,从而测试我可以获得什么样的速度。

然而,尽管我的 Arduino 草图与串行监视器一起工作得很好,即我可以向它发送信息并从中读取信息,但我无法让它与 Python 一起工作。

使用我的 Python 脚本,我可以打开连接并读取 Arduino 写入的内容,但由于某种原因,从 Python 写入时出现问题。我尝试了以下方法,但其中 none 行得通:

我不知道接下来要尝试什么……

Python (2.7) 代码

import serial, time, random, string

device = serial.Serial('/dev/tty.usbserial-A105YOZX', baudrate = 38400)

initial_time = time.time()
current_time = time.time()

counter = 0
control = 0

while counter < 1000:
    current_time = time.time()
    if current_time - initial_time > 0.1:
        initial_time = current_time
        counter += 1
        device.read()
    if current_time - initial_time > 1 and control == 0:
        device.write(b"Message being sent")
        control = 1

Arduino 代码

#define RAW_LEN 64 //max length of incoming string (buffer size is only 64 bytes)

//variables for incoming data
char raw_data[RAW_LEN];
int raw_data_i = 0; //index

unsigned long my_time;
int control = 0;
int for_print;

int get_data(int i) {
  //fills up raw_data[] with serial data. Clears raw_data if it gets too long
  if (Serial.available()>0) {
    raw_data[i] = Serial.read();
    Serial.println(raw_data[i]);
    //Serial.println(raw_data[i]);
    if (i<RAW_LEN-1){
      i++;
    }
  }
  return i;
}

void clear_data() {
  //clears raw_data and resets raw_data_i
  raw_data_i = 0;
  memset(raw_data,'[=12=]',RAW_LEN-1);
}

//print functions
void raw_print(char data[]) {
  Serial.println("Received data: ");
  //if (raw_data[0] == 'T') {digitalWrite(LED_BUILTIN, HIGH);}
  for (int i=0; i< RAW_LEN;i++) {
    Serial.println(data[i]);
  }
}

void setup() {
  Serial.begin(38400);
  Serial.println("Restart");
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

void loop() {
  my_time = millis();
  raw_data_i = get_data(raw_data_i);
  //clear raw_data if it gets full
  if (raw_data_i == RAW_LEN-1) {
    clear_data();
  }

  if (my_time > 5000 && control == 0) {
    Serial.println("Here");
    raw_print(raw_data);
    control = 1;
  }
}

原来问题出在Python代码中。在while循环中第一个if语句在0.1秒后是True,然后在第二个if语句是True.[=18之前再执行9次=]

问题在于 device.read() 如果没有接收到字符就会挂起。因为我没有从 Arduino 发送足够的字符,所以 Python 代码在 device.read() 处暂停并且从未到达第二个 if 语句。

一个烦人的错误,花了一段时间才弄清楚,希望这个问题和答案能为其他人节省大量调试时间。