Как получить 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};
отправить данные, как задумано.