写出字节

时间:2017-05-02 03:28:36

标签: python pyserial

我正在使用Pyserial将字节写入连接。

我一直在努力解决的问题之一就是弄清楚如何准确地写出我想要的东西。我已成功写出字符串ascii形式的字节,例如

variable = 'h'.encode()
serial.write(variable)

这将成功地写出H的位。 但是,如果我使用b' \ b001'它不会像我希望的那样写出001。

有没有办法做到这一点所以我可以简单地使用1和0定义变量,然后使用write函数。

我也尝试过像这样定义:

y = 0x13
out = s.write(y)

根据write函数的文档,该函数返回写入的字节数。当我运行此特定代码时,它返回19

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你试图找到一种方法将二进制数据作为python bytes对象发送,将十六进制数据作为python bytes对象发送(在第二部分中)。

它可能是反直觉的,但是pythons b''语法并不代表binary, but bytes,因此b'0010101'为什么不能像你想要的那样工作。

默认情况下,字节接受十六进制数据作为字节,为此,您需要将十六进制数据格式化为b'\xFF\x04'。例如

byte_obj = bytes(b'\xFF\x04')

然后可以通过pyserial发送。要做二进制文件,你需要使用python int的构造方法,即int(number, base)方法。

进一步解释here

但这基本上可以通过

来完成
bin_to_int int('01010101', 2)
byte_obj = bytes([bin_to_int]) #requires array of ints

不幸的是,这只适用于大小为8位的二进制字符串(并且会告诉您错误)。为了解决这个问题,您可以执行以下操作:

bin_to_int int('0101010101010101', 2)
# to_bytes takes size in bytes and endianess, which is the order the bytes are placed.
byte_obj = bin_to_int.to_bytes(2, 'little')

little endian是least significant byte in smallest address(即索引0)大对面

小心更大的二进制整数方法,我不确定python在内部将二进制转换为整数是什么,但对于任意大的二进制数据,我怀疑由于我将如何实现转换而减速。我将举例说明为什么我要如何进行无符号整数转换:

bit_string = "101010101..."
exponent = 0
decimal_value = 0
for bit in bit_string:
    decimal_value += int(bit)**exponent
    exponent += 1

一开始可能不是很明显,但是因为python int是任意大小的,所以最终你将达到你在一起添加非常大的整数,超出典型的算术int大小(即大于64位) 。这意味着随着时间的推移,大的二进制值(你可能会产生)你会得到非线性的时间复杂度,因为N会增加增加的字节大小以及它们在64位之外的增长(并且更多的处理将会需要完成添加,这将是O(n_bytes)而不是O(1))

要解决此问题,您只需要创建一个函数来分隔二进制值,然后再将它们转换为字节(如binary_to_bytes(binary_string)