Как получить 5-значные данные из Arduino с помощью Pyserial?

Я пытаюсь получить данные (массивы) из Arduino в мой скрипт на Python, кажется, что все работает нормально, пока я не попробую получить 5 или более цифр. Некоторые поиски предполагают, что это, вероятно, связано с чтением Pyserial только определенного количества байтов за раз, но я не могу понять, что мне нужно изменить, чтобы иметь возможность читать мои массивы. Пожалуйста, посмотрите на мои коды: Arduino код:

int data[] = {1245,2211,33498,4212,5235};
void setup() {
Serial.begin(9600);
}

void loop() {
for (int i=0; i<5; i++)
{
  Serial.println(data[i]);
}

  //Commented this out because it'd give me garbage value in python
  //delay(1000);
}

Код Python:

import serial
ser1 = serial.Serial('COM6', 9600) 
#receive some data
for i in range(5):
   arduinoData = ser1.readline().decode('ascii')
   print(arduinoData)

После запуска этого кода я получаю:

1245

2211

-32038 (Почему это значение было преобразовано в отрицательное число?)

4212

5235

2 ответа

Решение

Это ошибка переполнения на стороне Arduino.

Целое число со знаком (int) может принимать значения от -32768 в 32767 (так как это два байта, каждый 8 немного делая 16 число байтов, начиная от -2^15 в 2^15-1). поскольку 33498 больше, чем этот верхний предел, он оборачивается отрицательно.

Чтобы использовать это, измените ваш массив целых чисел на тип данных, который поддерживает большие положительные числа, чем 32767 - такие как uint_16,


Если вы заинтересованы, мы можем точно понять, почему отрицательное число было -32038,

Это потому, что все целые числа со знаком представлены с помощью дополнения до двух.

И в этой системе 1000001011011010 (33498) является -32038,

Чтобы сделать это преобразование, мы отрицаем его (чтобы получить его положительное представление (инвертируя все его биты и добавляя 1:

1000001011011010 --> 0111110100100101 --> 0111110100100110 == 32038

Ваше назначение

int data[] = {1245,2211,33498,4212,5235};

переполнения для чисел за пределами положительного диапазона int, Итак data массив уже содержит отрицательные числа.

Исправьте ваш код c

unsigned int data[] = {1245,2211,33498,4212,5235};

отправить данные, как задумано.

Другие вопросы по тегам