【问题标题】:IndexError: list index out of range - Python/ArduinoIndexError:列表索引超出范围 - Python/Arduino
【发布时间】:2019-08-20 20:08:09
【问题描述】:

在我最近的项目中,我尝试将串行数据从 Arduino 发送到 Python。使用 pyserial 可以完美地完成。但我这里有一个问题。我无法拆分我的数据。所有都存储在 Python coed 中的一个变量中,但我想拆分它。

Aduino 代码:

#define sw1 6
#define sw2 5
#define sw3 4
#define sw4 3

int vote1 = 0;
int vote2 = 0;
int vote3 = 0;
int vote4 = 0;

void setup()
{
  Serial.begin(9600);

  pinMode(sw1, INPUT);
  pinMode(sw2, INPUT);
  pinMode(sw3, INPUT);
  pinMode(sw4, INPUT);

  digitalWrite(sw1, HIGH);
  digitalWrite(sw2, HIGH);
  digitalWrite(sw3, HIGH);
  digitalWrite(sw4, HIGH);
}

void loop()
{
  if (digitalRead(sw1) == 0)
  {
    vote1++;
    Serial.print(vote1);
    Serial.print(("\t"));
    Serial.print(vote2);
    Serial.print(("\t"));
    Serial.print(vote3);
    Serial.print(("\t"));
    Serial.print(vote4);

    while (digitalRead(sw1) == 0);
  }
  if (digitalRead(sw2) == 0)
  {
    vote2++;
    Serial.print(vote1);
    Serial.print(("\t"));
    Serial.print(vote2);
    Serial.print(("\t"));
    Serial.print(vote3);
    Serial.print(("\t"));
    Serial.print(vote4);

    while (digitalRead(sw2) == 0);
  }
  if (digitalRead(sw3) == 0)
  {
    vote3++;
    Serial.print(vote1);
    Serial.print(("\t"));
    Serial.print(vote2);
    Serial.print(("\t"));
    Serial.print(vote3);
    Serial.print(("\t"));
    Serial.print(vote4);

    while (digitalRead(sw3) == 0);
  }
  if (digitalRead(sw4) == 0)
  {
    vote4++;
    Serial.print(vote1);
    Serial.print(("\t"));
    Serial.print(vote2);
    Serial.print(("\t"));
    Serial.print(vote3);
    Serial.print(("\t"));
    Serial.print(vote4);

    while (digitalRead(sw4) == 0);
  }
}

在这里,我尝试使用四个按钮将四个不同的值从 Arduino 发送到 Python。

Python 代码:

import serial
import time

ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)

while 1:
    arduinoData = ser.readline().decode('utf-8')
    data = arduinoData.split("\t")

    a = data[0]
    b = data[1]
    c = data[2]
    d = data[3]

我收到如下错误:

Traceback(最近一次调用最后一次):文件 “/home/pi/serialConnection_2.py”,第 11 行,在 b = data[1] IndexError: 列表索引超出范围

如果我像下面这样更改我的 python 代码:

import serial
import time

ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)

while 1:
    arduinoData = ser.readline().decode('utf-8')
    data = arduinoData.split("\t")

    print(data)

然后我可以接收所有四个值,如下所示:

['']
['']
['']
['']
['']
['']
['']
['']
['']
['1 , 0 , 0 , 0']
['2 , 0 , 0 , 0']
['3 , 0 , 0 , 0']
['4 , 0 , 0 , 0']
['4 , 1 , 0 , 0']
['4 , 1 , 1 , 0']
['4 , 1 , 2 , 0']
['4 , 1 , 2 , 1']
['4 , 1 , 2 , 2']
['4 , 1 , 2 , 3']
['']
['']
['']

每当我根据该列表的值按下按钮时,都会正确更新。我不知道为什么我无法访问列表的成员。

【问题讨论】:

  • 显然你也会得到很多空行。你可以丢弃它们:if not arduinoData:continue

标签: python arduino pyserial


【解决方案1】:

当输入string is empty 时,Python 中的split 返回['']。然后您尝试访问data 中不存在的索引(即data[1] 等),因为您的串行接收到许多空字符串,因此请尝试在处理数据之前检查是否存在:

arduinoData = ser.readline().decode('utf-8')
if arduinoData:
    data = arduinoData.split("\t")

    a = data[0]
    b = data[1]
    c = data[2]
    d = data[3]

【讨论】:

    猜你喜欢
    • 2016-08-25
    • 2017-04-05
    • 2012-07-15
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多