3

私はpythonが初めてで、この特定のプロジェクトのためだけに学習しようとしています。私がやっていることは、本質的に arduino クローンと NRf24 トランシーバーを使用して、次の構造体を無線で送信することです。

struct SENSOR{
  float sensor1;
  float sensor2;
  float sensor3;
};

struct HEADER{
  long type;
  long hops;
  long src;
  long ID;
  SENSOR sensor;
};

そして、NRf24でビーグルボーンブラックを使用して受信しています。BBB では、トランシーバーは python によって駆動されています (BBB と私が使用しているラジオ用の (比較的) 大規模なコード ベースが既に存在するため)。

arduino側では、構造体の長さが28と表示されており、それはpython側でも受け取っています。私が理解できないのは、配列に格納されている受信データを使用可能な形式に移動する方法です。

Python 側:

#Receive Data
recv_buffer = []
radio.read(recv_buffer)

これは私がpython側で受け取っているものです

[1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 51, 51, 163, 64, 51, 51, 195, 64, 51, 51, 227, 64]

そしてarduino側で送信

header.type = 1;
header.hops = 2;
header.src = 3;
header.ID = 4;
header.sensor.sensor1 = 5.1;
header.sensor.sensor2 = 6.1;
header.sensor.sensor3 = 7.1;

私は ctypes ライブラリを調べていて、おそらく unpack を使用していますが、動作させることができません。助けていただければ幸いです。

4

1 に答える 1

3

構造体モジュールを使用します。

まず、整数(バイト、実際には)値の配列を次のような文字列表現に変換します

''.join(chr(c) for c in recv_buffer)

...そして、その文字列をstruct.unpackフォーマット文字で渡す関数に渡し、文字列を実際の値に解析する方法を指定します。

>>> import struct
>>> b = [1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 51, 51, 163, 64, 51, 51, 195, 64, 51, 51, 227, 64]
>>> struct.unpack("llllfff", ''.join(chr(c) for c in recv_buffer))
(1, 2, 3, 4, 5.0999999046325684, 6.0999999046325684, 7.0999999046325684)
于 2014-01-03T19:10:07.537 に答える