2010-08-17 2 views
1

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

+0

Выполняет ли 'Serial.print()' преобразование ASCII ('itoa' или подобное) или отправляет номер обратно в виде двоичного кода? Если AVR принимает байты назад, то снова передает их обратно на ваш компьютер, он будет выглядеть хорошо ... –

+0

В Arduino вы можете указать, как он его отправит, в моем случае я отправляю его обратно в виде десятичного числа (см. второй параметр, DEC). Serial.print (val, DEC); // отправляем на python, чтобы проверить – toddstavish

ответ

3

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

+1

Примечание: Arduino - маленький конец. Вы можете поменять endianess с помощью структурного модуля, но мне не пришлось этого делать. Для записи я был на x86 mac osx 10.6.4. python 2.6.1, 64 бит. – toddstavish

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 
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)); 
    } 

Нет союз необходимо и коротко!

Смежные вопросы