【发布时间】:2012-09-23 20:44:42
【问题描述】:
我正在尝试将浮点数据从 arduino 发送到 python。数据以 8 个连续字节的数据(双精度大小)后跟换行符('\n')发送。如何收集这些连续字节和在 python 端(系统端)将其转换为正确的格式
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 代码。当然这不会以正确的格式打印数据,而只是想显示我尝试过的内容。
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模块,但我不确定在浮点数上使用它是否是个好主意。也许您应该使用整数或使用您自己的二进制格式。另外,请记住,您以原始二进制表示形式发送数字,因此它肯定包含换行符的 ASCII 代码。你应该使用read而不是readline(忘记换行,你不需要它) -
struct.unpack是经过精心编写的,以正确解包通过网络接收的 IEEE 754 浮点数,无论它们在运行 Python 的机器上如何表示。但它仍然希望接收指定格式的浮点数,发送方应确保发送。根据您的问题,我查看了 arduino 的网站,对 learn Arduinodouble实际上是单宽度精度数感到惊讶,这意味着struct必须使用f格式,而不是d.我会更新答案。