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 바이트 세트 이 경우에는 을 풀었습니다입니다. 우리가 여기서 무엇을 할 수 있는지에 대한 아이디어는 무엇입니까 ??
분명히 ['struct'] (http://docs.python.org/library/struct.html) 모듈을 사용하고 싶지만 부동에서 사용하는 것이 좋은지 잘 모르겠습니다. 포인트 번호. 어쩌면 정수 대신 자신의 바이너리 형식을 사용해야합니다. 또한, 원시 이진 표현으로 번호를 전송하므로 개행을위한 ASCII 코드를 확실히 포함 할 수 있습니다. 'readline' 대신에'read'를 사용해야합니다 (개행을 잊어 버릴 필요는 없습니다) –
'struct.unpack'은 와이어를 통해 수신 된 IEEE 754 부동 소수점을 올바르게 풀기 위해 신중하게 작성되었습니다. Python을 실행하는 컴퓨터에서 나타납니다. 그러나 여전히 송신자가 보낼 수 있도록 지정된 형식의 부동 소수점을 수신 할 것으로 기대합니다. 귀하의 질문에 의해 프롬프트, 나는 arduino의 사이트를 쳐다 보면서 놀랍게도 [Arduino'double]은 실제로 단일 너비의 정밀도 숫자라는 사실에 놀랐다. (http://arduino.cc/en/Reference/Double) struct'는'd'가 아닌'f' 형식으로 주어져야합니다. 나는 대답을 업데이트 할 것이다. – user4815162342