2012-09-23 2 views
0

arduino에서 python으로 부동 소수점 데이터를 보내려고합니다. 데이터는 8 개의 연속 데이터 바이트 (더블의 크기)와 개행 문자 ('\ n') 이러한 연속적인 바이트를 수집하고 파이썬 종료 (시스템 종료)arduino에서 'double'형식의 데이터를 수집합니다.

void USART_transmitdouble(double* d) 
{ 
    union Sharedblock 
    { 
     char part[sizeof(double)]; 
     double data; 

    }my_block; 
    my_block.data = *d; 
    for(int i=0;i<sizeof(double);++i) 
    { 
     USART_send(my_block.part[i]); 
    } 

    USART_send('\n'); 
} 

int main() 
{ 
    USART_init(); 
    double dble=5.5; 
    while(1) 
    { 
     USART_transmitdouble(&dble); 
    } 
    return 0; 
} 

파이썬 code.Sure이 적절한 형식의 데이터를 인쇄하지 않을에 적절한 형식으로 변환 할 볼까하지만, 그냥 내가 시도 것을 보여주고 싶은 .

import serial,time 

my_port = serial.Serial('/dev/tty.usbmodemfa131',19200) 
while 1: 
    print my_port.readline(), 
    time.sleep(0.15) 

업데이트 :

my_ser = serial.Serial('/dev/tty.usbmodemfa131',19200) 

while 1: 
    #a = raw_input('enter a value:') 
    #my_ser.write(a) 
    data = my_ser.read(5) 
    f_data, = struct.unpack('<fx',data) 
    print f_data 
    #time.sleep(0.5) 

상기 코드 에서처럼 struct 모듈을 사용하여 플로트 값을 출력 할 수있다. 그러나

시간의 50 %는 데이터가 올바르게 인쇄됩니다.하지만 time.sleep()을 사용하거나 전송을 중지하고 다시 시작하면 잘못된 값이 출력됩니다. 잘못된 4 바이트 세트 이 경우에는 을 풀었습니다입니다. 우리가 여기서 무엇을 할 수 있는지에 대한 아이디어는 무엇입니까 ??

+1

분명히 ['struct'] (http://docs.python.org/library/struct.html) 모듈을 사용하고 싶지만 부동에서 사용하는 것이 좋은지 잘 모르겠습니다. 포인트 번호. 어쩌면 정수 대신 자신의 바이너리 형식을 사용해야합니다. 또한, 원시 이진 표현으로 번호를 전송하므로 개행을위한 ASCII 코드를 확실히 포함 할 수 있습니다. 'readline' 대신에'read'를 사용해야합니다 (개행을 잊어 버릴 필요는 없습니다) –

+2

'struct.unpack'은 와이어를 통해 수신 된 IEEE 754 부동 소수점을 올바르게 풀기 위해 신중하게 작성되었습니다. Python을 실행하는 컴퓨터에서 나타납니다. 그러나 여전히 송신자가 보낼 수 있도록 지정된 형식의 부동 소수점을 수신 할 것으로 기대합니다. 귀하의 질문에 의해 프롬프트, 나는 arduino의 사이트를 쳐다 보면서 놀랍게도 [Arduino'double]은 실제로 단일 너비의 정밀도 숫자라는 사실에 놀랐다. (http://arduino.cc/en/Reference/Double) struct'는'd'가 아닌'f' 형식으로 주어져야합니다. 나는 대답을 업데이트 할 것이다. – user4815162342

답변

2

Arduino에서 doublethe same as float, 즉 4 바이트의 메모리를 차지하는 little-endian single-precision floating-point number입니다. 이 때문에 readline을 사용하지 않으

import struct 
... 

data = my_port.read(5) 
num, = struct.unpack('<fx', data) 

주 : 이것은 당신이 정확히 5 바이트를 읽어 압축을 해제하기 위해 f 형식의 작은 엔디안 변형을 사용하고 x와 후행 줄 바꿈을 무시해야한다는 것을 의미 부동 소수점 표현의 모든 바이트는 '\n'이 될 수 있습니다.

Nikklas B.가 지적했듯이, 개행을 신경 쓰지 않고도 4 바이트를 보내고 파이썬에서 많은 것을 읽을 수 있습니다. 이 경우 형식 문자열은 '<f'이됩니다.

+0

내가 arduino를 사용하고 있지만 라이브러리를 사용하지 않아도됩니다. 내 대학에서는 arduino 라이브러리를 사용하지 않기를 원합니다. 간단한 atmega328p 개발 보드로 사용하고 있습니다.이 풀기를 시도 할 것입니다. 지금 다시보고하십시오. – tez

+0

그리고 나는 둘 다 시도했다. 잘한다. arduino 끝에서 개행 문자를 보내는 것을 멈추고 4 바이트의 데이터를 읽으려면 my_port.read (4)와 함께 ' tez

+1

'struct.Struct (' user4815162342

관련 문제