0

我正在尝试将浮点数据从 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 个字节集.关于我们可以在这里做什么的任何想法?

4

1 回答 1

2

在 Arduino 上,adouble相同float,即占用 4 字节内存的 little-endian单精度浮点数。这意味着您应该准确读取 5 个字节,使用该f格式的 little-endian 变体来解压它,并忽略尾随的换行符x

import struct
...

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

请注意,您不想使用readline,因为浮点数表示的任何字节都可以是'\n'.

正如 Nikklas B. 指出的那样,您甚至根本不需要换行,只需发送 4 个字节并从 Python 中读取尽可能多的字节。在这种情况下,格式字符串将为'<f'.

于 2012-09-23T20:56:27.620 回答