Отправка целочисленных значений в Arduino из PySerial

1

Мне нужно отправить целые числа больше 255? Кто-нибудь знает, как это сделать?

  • 0
    Выполняет ли Serial.print() преобразование ASCII ( itoa или подобное) или отправляет число обратно в двоичном виде? Если AVR получает байты в обратном направлении, а затем передает их обратно на компьютер в обратном порядке, это будет выглядеть нормально ...
  • 0
    В Arduino вы можете указать, как он отправляет его обратно, в моем случае я отправляю его обратно в виде десятичного числа (см. Второй параметр, DEC). Serial.print (val, DEC); // отправить в python для проверки
Теги:
arduino

3 ответа

4

Вот как (спасибо за идею, Алекс!):

Python:

def packIntegerAsULong(value):
    """Packs a python 4 byte unsigned integer to an arduino unsigned long"""
    return struct.pack('I', value)    #should check bounds

# To see what it looks like on python side
val = 15000
print binascii.hexlify(port.packIntegerAsULong(val))

# send and receive via pyserial
ser = serial.Serial(serialport, bps, timeout=1)
ser.write(packIntegerAsULong(val))
line = ser.readLine()
print line

Arduino:

unsigned long readULongFromBytes() {
  union u_tag {
    byte b[4];
    unsigned long ulval;
  } u;
  u.b[0] = Serial.read();
  u.b[1] = Serial.read();
  u.b[2] = Serial.read();
  u.b[3] = Serial.read();
  return u.ulval;
}
unsigned long val = readULongFromBytes();
Serial.print(val, DEC); // send to python to check
3

Кодировать их в двоичные строки с помощью модуля Python struct. Я не знаю, хочет ли ардуино их мини-эндиан или big-endian, но, если его документы неясно об этом, небольшой эксперимент должен легко решить вопрос: -).

  • 1
    Примечание: Arduino является прямым порядком байтов. Вы можете поменять местами байты с помощью модуля struct, хотя мне это и не нужно. Просто для записи я был на intel x86 mac osx 10.6.4. Python 2.6.1, 64 бит.
0

Путь проще:

  crc_out = binascii.crc32(data_out) & 0xffffffff   # create unsigned long
  print "crc bytes written",arduino.write(struct.pack('<L', crc_out)) #L, I whatever u like to use just use 4 bytes value

  unsigned long crc_python = 0;
  for(uint8_t i=0;i<4;i++){        
    crc_python |= ((long) Serial.read() << (i*8));
  }

Не требуется соединение и короткое!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню