如何列出两个字节的值
How to list a two byte value
我在 Python 中使用 pyserial 与设备进行串行通信。我必须从设备中读取一系列整数。每个元素都是一个 2 字节的无符号短整数 [0 - 65535]。
我将端口初始化为
port = serial.Serial("COM9", 38400, timeout=10.0)
serial.PARITY_NONE
serial.EIGHTBITS
serial.STOPBITS_ONE
data = port.read(50)
从设备接收到的数据是
data=b' \xa0G\x0b1\x12\x04\x98\x93A\xcc\xb8\x86\x80V\xf1\xbdp \xc5a\x14\x13\xe8\x8b\x05\xe3P\xc99H\x02\xb8{&\x88\xa6 \x16Q&\xd4\x90j\xea'
当字节转换为字节列表时,我得到
data1=list(data)
print(data1)
字节数总是变化的。提供输出样本
[32, 132, 62, 66, 160, 16, 136, 44, 160, 71, 11, 49, 18, 4, 152, 147, 65, 204, 184, 134, 128, 86, 241, 189, 112, 32, 197, 97, 20, 19, 232, 139, 5, 227, 80, 201, 57, 72, 2, 184, 123, 38, 136, 166, 32, 22, 81, 38, 212, 144, 106, 234, 177, 192, 193, 255, 156, 90, 15, 32, 102, 5, 120, 104, 173, 224, 207, 100, 81, 19, 248, 105, 97, 12, 191, 192, 56, 208, 91, 9, 36, 141, 34, 172, 6, 91, 5, 48, 42, 22, 4, 81, 4, 38, 7, 232, 162, 18, 65, 93, 16, 33, 144, 174, 186, 221, 0, 237, 133, 25, 183, 129, 116, 48, 246, 119, 36, 150, 27, 75, 49, 33, 38, 34, 238, 41, 124, 29, 192, 16, 191, 50, 14, 22, 39, 209, 66, 17, 206, 29, 209, 175, 92, 120, 99, 49]
无法列出两个字节的值。使用列表方法我可以获得的最大值是 255。我应该得到 65535 之前的值。
使用结构模块,
from struct import unpack
data1= unpack('H', data)
我收到以下错误
struct.error: unpack requires a bytes object of length 15
您 unpack
的格式有误。您指定了一个 10 字节的字符串,后跟两个无符号短裤,然后是一个有符号字节。如错误消息中所示,这最多会增加 15 个字节。您有一个 45 字节的缓冲区,因此您需要准确指定缓冲区应该包含的内容。
假设发布的数据不正确,只是复制粘贴错误,因为您无法将长度为 45
的字节数组转换为无符号短数组,而不丢失最后一个字节。
您可以使用的格式是 - '<' + 'H' * (len(data)//2)
(对于 litte endian)。这将使格式从 data
字节数组中读入 len(data)//2
数量的无符号短裤。示例(在转换您提供的 data1
数组后 -
>>> import struct
>>> s = [32, 132, 62, 66, 160, 16, 136, 44, 160, 71, 11, 49, 18, 4, 152, 147, 65, 204, 184, 134, 128, 86, 241, 189, 112, 32, 197, 97, 20, 19, 232, 139, 5, 227, 80, 201, 57, 72, 2, 184, 123, 38, 136, 166, 32, 22, 81, 38, 212, 144, 106, 234, 177, 192, 193, 255, 156, 90, 15, 32, 102, 5, 120, 104, 173, 224, 207, 100, 81, 19, 248, 105, 97, 12, 191, 192, 56, 208, 91, 9, 36, 141, 34, 172, 6, 91, 5, 48, 4
2, 22, 4, 81, 4, 38, 7, 232, 162, 18, 65, 93, 16, 33, 144, 174, 186, 221, 0, 237, 133, 25, 183, 129, 116, 48, 246, 119, 36, 150, 27, 75, 49, 33, 38, 34, 238, 41, 124, 29, 192, 16, 191, 50, 14, 22, 39, 209, 66, 17, 206, 29, 209, 175, 92, 120, 99, 49]
>>> len(s)
146
>>> data = struct.pack('B' * len(s) , *s)
>>> data
b' \x84>B\xa0\x10\x88,\xa0G\x0b1\x12\x04\x98\x93A\xcc\xb8\x86\x80V\xf1\xbdp \xc5a\x14\x13\xe8\x8b\x05\xe3P\xc99H\x02\xb8{&\x88\xa6 \x16Q&\xd4\x90j\xea\xb1\xc0\xc1\xff\x9cZ\x0ff\x05xh\xad\xe0\xcfdQ\x13\xf8ia\x0c\xbf\xc08\xd0[\t$\x8d"\xac\x06[\x050*\x16\x04Q\x04&\x07\xe8\xa2\x12A]\x10!\x90\xae\xba\xdd\x00\xed\x85\x19\xb7\x81t0\xf6w$\x96\x1bK1!&"\xee)|\x1d\xc0\x10\xbf2\x0e\x16\'\xd1B\x11\xce\x1d\xd1
\xaf\xc1'
>>> data1 = struct.unpack('<' + 'H' * (len(data)//2) , data)
>>> data1
(33824, 16958, 4256, 11400, 18336, 12555, 1042, 37784, 52289, 34488, 22144, 48625, 8304, 25029, 4884, 35816, 58117, 51536, 18489, 47106, 9851, 42632, 5664, 9809, 37076, 60010, 49329, 65473, 23196, 8207, 1382, 26744, 57517, 25807, 4945, 27128, 3169, 49343, 53304, 2395, 36132, 44066, 23302, 12293, 5674, 20740, 9732, 59399, 4770, 23873, 8464, 44688, 56762, 60672, 6533, 33207, 12404, 30710, 38436, 19227, 8497, 8742, 10734, 7548, 4288, 12991, 5646, 53543, 4418, 7630, 45009, 30812, 12643)
假设小端。
我在 Python 中使用 pyserial 与设备进行串行通信。我必须从设备中读取一系列整数。每个元素都是一个 2 字节的无符号短整数 [0 - 65535]。 我将端口初始化为
port = serial.Serial("COM9", 38400, timeout=10.0)
serial.PARITY_NONE
serial.EIGHTBITS
serial.STOPBITS_ONE
data = port.read(50)
从设备接收到的数据是
data=b' \xa0G\x0b1\x12\x04\x98\x93A\xcc\xb8\x86\x80V\xf1\xbdp \xc5a\x14\x13\xe8\x8b\x05\xe3P\xc99H\x02\xb8{&\x88\xa6 \x16Q&\xd4\x90j\xea'
当字节转换为字节列表时,我得到
data1=list(data)
print(data1)
字节数总是变化的。提供输出样本
[32, 132, 62, 66, 160, 16, 136, 44, 160, 71, 11, 49, 18, 4, 152, 147, 65, 204, 184, 134, 128, 86, 241, 189, 112, 32, 197, 97, 20, 19, 232, 139, 5, 227, 80, 201, 57, 72, 2, 184, 123, 38, 136, 166, 32, 22, 81, 38, 212, 144, 106, 234, 177, 192, 193, 255, 156, 90, 15, 32, 102, 5, 120, 104, 173, 224, 207, 100, 81, 19, 248, 105, 97, 12, 191, 192, 56, 208, 91, 9, 36, 141, 34, 172, 6, 91, 5, 48, 42, 22, 4, 81, 4, 38, 7, 232, 162, 18, 65, 93, 16, 33, 144, 174, 186, 221, 0, 237, 133, 25, 183, 129, 116, 48, 246, 119, 36, 150, 27, 75, 49, 33, 38, 34, 238, 41, 124, 29, 192, 16, 191, 50, 14, 22, 39, 209, 66, 17, 206, 29, 209, 175, 92, 120, 99, 49]
无法列出两个字节的值。使用列表方法我可以获得的最大值是 255。我应该得到 65535 之前的值。
使用结构模块,
from struct import unpack
data1= unpack('H', data)
我收到以下错误
struct.error: unpack requires a bytes object of length 15
您 unpack
的格式有误。您指定了一个 10 字节的字符串,后跟两个无符号短裤,然后是一个有符号字节。如错误消息中所示,这最多会增加 15 个字节。您有一个 45 字节的缓冲区,因此您需要准确指定缓冲区应该包含的内容。
假设发布的数据不正确,只是复制粘贴错误,因为您无法将长度为 45
的字节数组转换为无符号短数组,而不丢失最后一个字节。
您可以使用的格式是 - '<' + 'H' * (len(data)//2)
(对于 litte endian)。这将使格式从 data
字节数组中读入 len(data)//2
数量的无符号短裤。示例(在转换您提供的 data1
数组后 -
>>> import struct
>>> s = [32, 132, 62, 66, 160, 16, 136, 44, 160, 71, 11, 49, 18, 4, 152, 147, 65, 204, 184, 134, 128, 86, 241, 189, 112, 32, 197, 97, 20, 19, 232, 139, 5, 227, 80, 201, 57, 72, 2, 184, 123, 38, 136, 166, 32, 22, 81, 38, 212, 144, 106, 234, 177, 192, 193, 255, 156, 90, 15, 32, 102, 5, 120, 104, 173, 224, 207, 100, 81, 19, 248, 105, 97, 12, 191, 192, 56, 208, 91, 9, 36, 141, 34, 172, 6, 91, 5, 48, 4
2, 22, 4, 81, 4, 38, 7, 232, 162, 18, 65, 93, 16, 33, 144, 174, 186, 221, 0, 237, 133, 25, 183, 129, 116, 48, 246, 119, 36, 150, 27, 75, 49, 33, 38, 34, 238, 41, 124, 29, 192, 16, 191, 50, 14, 22, 39, 209, 66, 17, 206, 29, 209, 175, 92, 120, 99, 49]
>>> len(s)
146
>>> data = struct.pack('B' * len(s) , *s)
>>> data
b' \x84>B\xa0\x10\x88,\xa0G\x0b1\x12\x04\x98\x93A\xcc\xb8\x86\x80V\xf1\xbdp \xc5a\x14\x13\xe8\x8b\x05\xe3P\xc99H\x02\xb8{&\x88\xa6 \x16Q&\xd4\x90j\xea\xb1\xc0\xc1\xff\x9cZ\x0ff\x05xh\xad\xe0\xcfdQ\x13\xf8ia\x0c\xbf\xc08\xd0[\t$\x8d"\xac\x06[\x050*\x16\x04Q\x04&\x07\xe8\xa2\x12A]\x10!\x90\xae\xba\xdd\x00\xed\x85\x19\xb7\x81t0\xf6w$\x96\x1bK1!&"\xee)|\x1d\xc0\x10\xbf2\x0e\x16\'\xd1B\x11\xce\x1d\xd1
\xaf\xc1'
>>> data1 = struct.unpack('<' + 'H' * (len(data)//2) , data)
>>> data1
(33824, 16958, 4256, 11400, 18336, 12555, 1042, 37784, 52289, 34488, 22144, 48625, 8304, 25029, 4884, 35816, 58117, 51536, 18489, 47106, 9851, 42632, 5664, 9809, 37076, 60010, 49329, 65473, 23196, 8207, 1382, 26744, 57517, 25807, 4945, 27128, 3169, 49343, 53304, 2395, 36132, 44066, 23302, 12293, 5674, 20740, 9732, 59399, 4770, 23873, 8464, 44688, 56762, 60672, 6533, 33207, 12404, 30710, 38436, 19227, 8497, 8742, 10734, 7548, 4288, 12991, 5646, 53543, 4418, 7630, 45009, 30812, 12643)
假设小端。