Как получить 5-значные данные из Arduino с помощью Pyserial? - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь получить данные (массивы) из 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 ]

0 голосов
/ 25 августа 2018

Ваше задание

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

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

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

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

чтобы отправить данные как положено.

0 голосов
/ 25 августа 2018

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

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

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


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

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

И в этой системе 1000001011011010 (33498) равно -32038.

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

1000001011011010 --> 0111110100100101 --> 0111110100100110 == 32038
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...