IndexError: список индексов вне диапазона - Python / Arduino - PullRequest
0 голосов
/ 29 марта 2019

В моем недавнем проекте я пытаюсь последовательно посылать данные из Arduino в Python.С помощью pyserial это сделано отлично.Но у меня есть одна проблема здесь.Я не могу разделить мои данные.Все они хранятся в одной переменной в Python-коде, но я хочу разделить ее.

Код 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']
['']
['']
['']

Когда я нажимаю кнопку в соответствии со значением этого списка, оно обновляется должным образом.Я не знаю, почему я не могу получить доступ к участникам списка.

1 Ответ

0 голосов
/ 29 марта 2019

split в Python возвращает [''], когда входная строка пуста . Затем вы пытаетесь получить доступ к индексу внутри 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...