Проблема отправки отрицательных значений через pyserial

#python #python-3.x #arduino #pyserial #atmega32

#python #python-3.x #arduino #pyserial #atmega32

Вопрос:

Мне нужно отправить координаты мыши из python в arduino. Как вы знаете, есть оси X и Y, и на этих осях есть некоторые отрицательные значения, такие как -15 или -10 и т. Д. Последовательный интерфейс Arduino принимает только байты, поэтому байты ограничены от 0 до 256. Моя проблема начинается прямо здесь. Я не могу отправлять отрицательные значения из python в arduino. Вот мой код для python :

 def mouse_move(x, y):
    pax = [x,y]
    arduino.write(pax)
    print(pax)
  

Например, когда x или y имеют отрицательное значение, например -5, программа завершает работу, потому что массив байтов равен 0-256 .

вот код моего arduino:

 #include <Mouse.h>

byte bf[2];
void setup() {
  Serial.begin(9600);
  Mouse.begin();
}

void loop() {
  if (Serial.available() > 0) {
    Serial.readBytes(bf, 2);
    Mouse.move(bf[0], bf[1], 0);
    Serial.read();
  }
}
  

Комментарии:

1. Достаточно ли [0,255] для передачи координат мыши с достаточной точностью? Я думаю, вам нужно было бы решить отправить координаты на большее количество байтов (например, 4 байта на направление) и реализовать собственное соглашение для отрицательного значения, например, зарезервировать самый значимый бит для знака

Ответ №1:

Вам нужно отправить больше байтов для представления каждого числа. Допустим, вы используете 4 байта на число. Пожалуйста, обратите внимание, что этот код должен быть адаптирован к интерфейсу arduino. На стороне python вам нужно будет сделать что-то вроде:

 def mouse_move(x, y):
    bytes = x.to_bytes(4, byteorder = 'big')   y.to_bytes(4, byteorder = 'big')
    arduino.write(bytes)

    print(pax)
  

На стороне получателя вам нужно восстановить число из их байтовых составляющих что
-то вроде:

 byte bytes[4] 
void loop() {
  int x,y; /* use arduino int type of size 4 bytes  */
  if (Serial.available() > 0) {
    Serial.readBytes(bytes, 4);
    x = bytes[0] << 24 | bytes[1] << 16 |  bytes[2] << 8 |  bytes[0]
    Serial.readBytes(bytes, 4);
    y = bytes[0] << 24 | bytes[1] << 16 |  bytes[2] << 8 |  bytes[0]
    Mouse.move(x, y, 0);
    Serial.read();
  }
}
  

Комментарии:

1. Спасибо за комментарий, на самом деле я не могу скомпилировать ваш код в свой. Чтобы понять основы этой темы, можете ли вы сказать мне, какие ключевые слова я должен искать в Интернете?

2. Здравствуйте. Вы можете посмотреть здесь, чтобы понять, как числа кодируются в памяти или, в вашем случае, как они могут передаваться по последовательной ссылке: embedded.com/endianness