0

arduino から python に浮動小数点データを送信しようとしています。データは、改行文字 ('\n') が続く 8 つの連続するバイト データ (倍精度のサイズ) として送信されます。これらの連続するバイトを収集して変換する方法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;
}

確かに、これはデータを適切な形式で出力しませんが、私が試したことを表示したいだけです。

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 バイトのメモリを占有するリトルエンディアンの単精度浮動小数点数です。これは、正確に 5 バイトを読み取り、フォーマットのリトル エンディアン バリアントをf使用して解凍し、末尾の改行を無視する必要があることを意味し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 に答える