Самый быстрый способ прочитать массив чисел из python

Я пытаюсь отправить массив чисел из Python в Arduino через последовательное соединение. Я могу надежно прочитать небольшой входящий набор чисел (например, 123435678) из python, который я могу затем проанализировать, поскольку я знаю, сколько цифр должно быть в каждом числе (например, 1, 23456, 78). Я делаю это с помощью своего кода Arduino:

void getInput() {
     char buff[9];
     int field1;
     char field2[6];
     char field3[3];

  Serial.readBytes(buff, 8); //читаем 8 байт из последовательного порта
  buff[9] = '\0'; // null завершает только что прочитанную строку
  Serial.println(buff); //проверяем, что мы его получили
  for(int i=0; i<buff_len;i++) { //теперь разделим строку на отдельные числа
    if(i==0) {
      field1 = buff[0] - 48; //превратить его в int, используя ASCII
    }
    if(i>=1 && i<6) {
      field2[i-1] = buff[i];
      field2[5] = '\0';
    }
    if(i>=6) {
      field3[i-6]=buff[i];
      field3[2] = '\0';
    }
  }
  for(int i=0;i<buff_len;i++) { //очистить буфер
    buff[i]=0;
  }
}

Но если бы я хотел отправить целый массив, содержимое которого я не знаю заранее, например так:

for i in range(200):
    ser.write(i)

Как лучше всего передать эти числа в Arduino и сохранить их в виде массива целых чисел? Должен ли я сначала создать массив в python как numpy.linspace() и отправить его?

, 👍0

Обсуждение

Хотя это, вероятно, не единственная ваша проблема, вы вызываете *неопределенное поведение* при записи в 10-й элемент (индекс 9) 9-элементного buff[9]., @Chris Stratton


1 ответ


Лучший ответ:

2

Если вы не знаете длину данных, вам нужно отправлять маркеры начала и конца, чтобы ваш другой код мог указать, где начинается и заканчивается передача. Я обычно использую < и >, поэтому пакет данных может выглядеть как <12345678>. Вам не нужно использовать эти конкретные символы, просто выберите то, что, как вы знаете, не будет отображаться в ваших данных.

,

Да. Добавление новой строки в конце каждого еще более распространено и хорошо сочетается со многими традиционными вычислительными инструментами. Так как кажется, что в каждой записи есть несколько полей, также может помочь использование пробела или запятой между ними., @Chris Stratton