如何让Arduino从Python读取序列?

时间:2017-12-07 20:50:01

标签: python-2.7 arduino arduino-uno pyserial

具体问题

我正在尝试使用串行USB线缆在Python脚本和我的Arduino Pro Mini之间进行通信。在Python中,我可以阅读Arduino所写的内容,但是Arduino既不能读取Python写的内容,也不能读取我无法处理的形式。这种现象最明显的方式是当我尝试编写Arduino刚从Python读取的内容时,再到Python。 Python中没有显示任何内容。

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

详细

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

然而,尽管我的Arduino草图与串行监视器配合得很好,即我可以发送信息并从中读取信息,但我无法使用它。

使用我的Python脚本,我可以打开连接并阅读Arduino写的内容,但由于某些原因,从Python编写时存在问题。我尝试了以下但没有一个有效:

  • 使用Uno代替Pro Mini。
  • Serial.println()函数中添加get_data()语句。什么都没打印出来。
  • 发送格式为" T(数字)的字符串;"并使用sscanf()提取数字。使用if语句检查数字并打开板载LED。没用。
  • 发送以" T"开头的字符串;并使用if语句查看它是否存储在raw_data[]中。它不是。
  • 在不同时间从Python写入数据(即使用更长的延迟)。
  • 使用device.write(b"mystring")device.write("mystring".encode())
  • 从Python编写

我不知道接下来会尝试什么......

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,'\0',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;
  }
}

1 个答案:

答案 0 :(得分:1)

问题最终出现在Python代码中。在df['diff']=np.nan df['diff']=df.loc[df.variation!='control','diff'].\ fillna(df.revenue-df.groupby('experiment').revenue.transform('first')) df Out[498]: experiment variation revenue diff 0 exp_1 control 100 NaN 1 exp_1 variation_1 90 -10.0 2 exp_1 variation_2 155 55.0 3 exp_2 control 50 NaN 4 exp_2 variation_1 95 45.0 5 exp_3 control 300 NaN 6 exp_3 variation_1 500 200.0 7 exp_3 variation_2 250 -50.0 8 exp_3 variation_3 610 310.0 循环中,第一个while语句在0.1秒后为if,然后在第二个True语句为if之前再执行9次。

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

一个令人烦恼的错误需要一段时间来弄明白,希望这个问题和答案能为其他人节省大量的调试时间。