Python 3 - 从int转换为'bytes'然后连接它们(用于串行传输)

时间:2013-09-05 15:19:11

标签: python python-3.x serial-port type-conversion byte

经过无聊的搜索......我有一个非常具体的问题,理解在Python 3.2中处理'bytes'和十六进制内容的方式。我知道我误解了,但似乎无法找到正确的道路。

我的最终目标是使用python串行模块传输一系列字节。有些字节是静态的,不会改变。其他人的价值从0到255不等。这些都需要一起刷,并立即传输。 (这些是可编程显示器的指令。代码包含设置BG颜色的固定指令,后面是R,G和B值的每个字节。我试图在循环中循环颜色强度进行测试,但后来我'我希望能够在显示器上实现这一功能。

经过测试成功运行的完整静态传输可能如下:

ser.write(b'\xAA\x11\x05\x00\x00\x00\xc3')  #this works great

同样,我可以将它们混合在一起,即:

ser.write(b'\xAA\x11\x05' + b'\x00\x00\x00\xc3')  #also works great

现在,如果我想取这三个零值字节中的一个,并用变量替换它,那么它都是梨形的。经过多次实验后,我最终得到的东西据称将For循环的整数变量转换为与上述字节序列串联的类型:

SET_BG_COLOR = b'\xAA\x03\x03'
for r in range(0,255):
            red = hex(r).encode('utf-8')
            blue = hex(255-r).encode('utf-8')
            ser.write(SET_BG_COLOR + blue + b'\x00' + red + b'\xC3') #BGR format

十六进制(整数).encode('utf-8')是迄今为止唯一的方法,它不仅仅会抛出一个错误,无法连接到其他东西我试图推断串行连接。但它不起作用,并且在查看结果时:

>>> x = b'\05'
>>> x
b'\x05'
>>> y = hex(5).encode('utf-8')
>>> y
b'0x5'
>>> type(x)
<class 'bytes'>
>>> type(y)
<class 'bytes'>
>>> x + y
b'\x050x5'   #(this is what I get)
>>> z = b'\05'
>>> x + z
b'\x05\x05'  #(this is what I want)
>>> 

看起来,虽然它让我连接......它是字符串数据的二进制表示,或者某些?那么让我连接,但它不是真正的十六进制值?我是否错过了从x = 255到x = b'\ FF'的明显方式?或者我的整个方法是错误的方法吗? -_-谢谢你的时间。

1 个答案:

答案 0 :(得分:5)

你在这里混淆Python字节文字语法;你不需要生成文字语法,只需要生成字节值; bytes()类型也接受一系列整数

>>> bytes([255])
b'\xff'

应用于您的代码:

SET_BG_COLOR = b'\xAA\x03\x03'
for r in range(0,255):
    red = bytes([r])
    blue = bytes([255 - r])
    ser.write(SET_BG_COLOR + blue + b'\x00' + red + b'\xC3') #BGR format

或者,更简单:

SET_BG_COLOR = [0xAA, 0x03, 0x03]
for r in range(0,255):
    ser.write(bytes(SET_BG_COLOR + [r, 0x00, 255 - r, 0xC3])) #BGR format

使用文字十六进制整数表示法。

r = 10的演示:

>>> SET_BG_COLOR = [0xAA, 0x03, 0x03]
>>> r = 10
>>> bytes(SET_BG_COLOR + [r, 0x00, 255 - r, 0xC3])
b'\xaa\x03\x03\n\x00\xf5\xc3'

hex()函数每字节输出4个字符;以文字0x开头,后跟整数的十六进制表示。编码为UTF8仍为4字节,b'\x30\x78\x30\x31'表示整数值10,例如,b'\x10'表示您想要的实际字节。