如何在python中从pyserialtransfer的数字列表中重建结构。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在python中从pyserialtransfer的数字列表中重建结构。相关的知识,希望对你有一定的参考价值。

我试图通过来回传递一个通用结构在我的笔记本电脑& 我的arduino之间进行双向通信,但在解包Arduino返回的字节时遇到了麻烦。使用pySerialTransfer,似乎rxBuff返回了一个数字列表,我不知道如何将其转换为一个字节串,让struct.unpack渲染回我开始的数字。

目前,Arduino代码只是简单地接收数据并将其吐回,Arduino方面没有进行转换或操作。这是我的Arduino代码。

#include "SerialTransfer.h"

SerialTransfer myTransfer;

struct POSITION {
  long id;
  float azimuth;
  float altitude;
} position;


void setup()
{
  Serial.begin(9600);
  myTransfer.begin(Serial);
}

void loop()
{
  if(myTransfer.available())
  {

    myTransfer.rxObj(position, sizeof(position));

    myTransfer.txObj(position, sizeof(position));
    myTransfer.sendData(sizeof(position));

  }
  else if(myTransfer.status < 0)
  {
    Serial.print("ERROR: ");

    if(myTransfer.status == -1)
      Serial.println(F("CRC_ERROR"));
    else if(myTransfer.status == -2)
      Serial.println(F("PAYLOAD_ERROR"));
    else if(myTransfer.status == -3)
      Serial.println(F("STOP_BYTE_ERROR"));
  }
}

还有我的python代码

import time
import struct
from pySerialTransfer import pySerialTransfer


def StuffObject(txfer_obj, val, format_string, object_byte_size, start_pos=0):
  """Insert an object into pySerialtxfer TX buffer starting at the specified index.

  Args:
    txfer_obj: txfer - Transfer class instance to communicate over serial
    val: value to be inserted into TX buffer
    format_string: string used with struct.pack to pack the val
    object_byte_size: integer number of bytes of the object to pack
    start_pos: index of the last byte of the float in the TX buffer + 1

  Returns:
    start_pos for next object
  """
  val_bytes = struct.pack(format_string, *val)
  for index in range(object_byte_size):
    txfer_obj.txBuff[index + start_pos] = val_bytes[index]
  return object_byte_size + start_pos


if __name__ == '__main__':
  try:
    link = pySerialTransfer.SerialTransfer('/dev/cu.usbmodem14201', baud=9600)

    link.open()
    time.sleep(2) # allow some time for the Arduino to completely reset
    base = time.time()

    while True:
      time.sleep(0.2)

      sent = (4, 1.2, 2.5)
      format_string = 'iff'
      format_size = 4+4+4
      StuffObject(link, sent, format_string, format_size, start_pos=0)
      link.send(format_size)

      start_time = time.time()
      elapsed_time = 0
      while not link.available() and elapsed_time < 2:
        if link.status < 0:
          print('ERROR: {}'.format(link.status))
        else:
          print('.', end='')
        elapsed_time = time.time()-start_time
      print()

      response =  link.rxBuff[:link.bytesRead]
      print(response)
      response = struct.unpack(format_string, response)

      print('SENT: %s' % str(sent))
      print('RCVD: %s' % str(response))
      print(' ')

  except KeyboardInterrupt:
    link.close()

当我运行python代码时,我得到了以下的错误。

Traceback (most recent call last):
  File "double_float.py", line 54, in <module>
    response = struct.unpack(format_string, response)
TypeError: a bytes-like object is required, not 'list'

但就在错误之前,我打印了响应: [4, 0, 0, 0, 154, 153, 153, 63, 0, 0, 32, 64].

我如何将这个列表转换成 struct.unpack 可以使用的东西?或者我如何直接解包那个数字列表?非常感谢

答案

这是你要找的吗。

import struct
data = [4, 0, 0, 0, 154, 153, 153, 63, 0, 0, 32, 64]
binary_str = bytearray(data)
result = struct.unpack("<lff", binary_str)
print(result)

輸出

(4, 1.2000000476837158, 2.5)

以上是关于如何在python中从pyserialtransfer的数字列表中重建结构。的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MicroPython 中从 C 调用 python 函数

如何在 Python 中从 Javascript 中读取值

如何在python中从字典创建属性?

如何在python中从以下获取表名

如何在 python 中从 redshift 更快地处理数据?

如何在python中从用户读取数组元素