2010-08-17 6 views
1

255보다 큰 정수를 보내야합니까? 누구든지이 작업을 수행하는 방법을 알고 있습니까?PySerial에서 Arduino로 정수 값 보내기

+0

'Serial.print()'는 ASCII 변환 ('itoa' 또는 유사)을 수행합니까, 아니면 이진수로 숫자를 보내고 있습니까? AVR이 바이트를 역방향으로 수신 한 다음 컴퓨터로 다시 전송하면 다시 되돌릴 수 있습니다. –

+0

Arduino에서 내 경우에는 그것을 다시 전송하는 방법을 지정할 수 있습니다 (10 진수로 다시 보냄). 두 번째 매개 변수, DEC). Serial.print (val, DEC); // python으로 체크를 보내십시오. – toddstavish

답변

3

파이썬의 struct 모듈로 이진 문자열로 인코딩합니다. arduino가 little-endian 또는 big-endian을 원한다면 나는 알지 못하지만, 이것에 대한 문서가 명확하지 않으면 약간의 실험을 통해 쉽게 문제를 해결해야합니다. 여기

+1

Note : Arduino는 리틀 엔디안입니다. 구조 모듈을 사용하여 엔디안을 바꿀 수는 있지만 꼭 할 필요는 없습니다. 단지 기록을 위해, 나는 Intel x86 mac osx 10.6.4에있었습니다. 파이썬 2.6.1, 64 비트. – toddstavish

4

방법 (아이디어 주셔서 감사합니다, 알렉스!)입니다 :

파이썬 :

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 

아두 이노 :

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

없음 조합 필요하고 짧다!