我正在尝试将arduino中的浮点数据发送到python。数据以8个连续字节的数据(大小为double)发送,然后是换行符('\ n')。如何收集这些连续的字节和在python end(系统结束)将其转换为适当的格式
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;
}
python 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个字节的集合是<在这种情况下强烈>解压缩。关于我们在这里可以做什么的任何想法?
答案 0 :(得分:2)
在Arduino上,double
是the same as float
,即占用4个字节内存的小端single-precision floating-point number。这意味着您应该准确读取5个字节,使用f
格式的little-endian变体将其解压缩,并忽略x
的尾随换行:
import struct
...
data = my_port.read(5)
num, = struct.unpack('<fx', data)
请注意,您不想使用readline
,因为浮点数表示的任何字节都可以是'\n'
。
正如Nikklas B.指出的那样,你甚至根本不需要打扰换行符,只需发送4个字节并从Python中读取尽可能多的字节。在这种情况下,格式字符串将为'<f'
。