用于串行通信的 Python 字节数组

Posted

技术标签:

【中文标题】用于串行通信的 Python 字节数组【英文标题】:Python byte array for Serial communication 【发布时间】:2015-10-27 08:26:01 【问题描述】:

我有一个程序需要通过串行通信发送一个字节数组。而且我不知道如何在 python 中制作这样的东西。 我找到了一个创建所需字节数组的 c/c++/java 函数:

byte[] floatArrayToByteArray(float[] input)

  int len = 4*input.length;
  int index=0;
  byte[] b = new byte[4];
  byte[] out = new byte[len];
  ByteBuffer buf = ByteBuffer.wrap(b);
  for(int i=0;i<input.length;i++) 
  
    buf.position(0);
    buf.putFloat(input[i]);
    for(int j=0;j<4;j++) out[j+i*4]=b[3-j];
  
  return out;

但是我怎样才能把它翻译成 python 代码。 编辑:串行数据发送到设备。我无法更改固件的地方。 谢谢

【问题讨论】:

看起来像 Java 代码,而不是 C++ 必须是bytearrays,还是可以是bytes?如果bytes 没问题,您可能需要struct 模块。 如果有样本输入/输出也很好。 可能是java sry。好吧,因为代码必须被发送到一个设备,该设备完全期望这种格式,它必须是那个字节数组 【参考方案1】:

将您的数据放入数组(这里是 [0,1,2] ),并使用:serial.write() 发送。我假设你已经正确打开了串口。

>> import array
>> tmp = array.array('B', [0x00, 0x01, 0x02]).tostring()
>> ser.write(tmp.encode())

回复使用:Binary data with pyserial(python serial port) 还有这个:pySerial write() won't take my string

【讨论】:

谢谢。这对我有帮助。但是,我不得不删除对“编码”的调用;它没有被识别。我刚刚通过了数组。我不知道——也许它与不同版本的 Python 有关。【参考方案2】:

这取决于您发送的是有符号还是无符号以及其他参数。有很多关于此的文档。这是我过去使用的一个例子。

x1= 0x04
x2 = 0x03
x3 = 0x02
x4 = x1+ x2+x3
input_array = [x1, x2, x3, x4]
write_bytes = struct.pack('<' + 'B' * len(input_array),  *input_array) 
ser.write(write_bytes)

要了解我为什么使用“B”和“

https://docs.python.org/2/library/struct.html

【讨论】:

以上是关于用于串行通信的 Python 字节数组的主要内容,如果未能解决你的问题,请参考以下文章

用于串行通信的 VB6 应用程序与 Java 8u60

avr和python之间串行通信时出现奇怪的b'\ x'数据

聊一聊SCON串行口控制寄存器

串行通信与并行通信

什么是同步头串行通信

更改串行通信中的字节顺序,MATLAB