我在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]
无法列出两个字节的值。使用list方法可以获得的最大值为255。我应该得到值到65535。
使用struct模块,
from struct import unpack
data1= unpack('H', data)
我收到以下错误
struct.error: unpack requires a bytes object of length 15
答案 0 :(得分:3)
假设发布的数据不正确,并且只是一个复制粘贴错误,因为您无法将长度为45
的字节数组转换为无符号短数组,而不会丢失最后一个字节。
您可以使用的格式是 - '<' + 'H' * (len(data)//2)
(对于litte endian)。这将使格式从len(data)//2
字节数组中的data
量的无符号短路中读取。示例(在转换您提供的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)
假设小端。
答案 1 :(得分:0)
您unpack
的格式错误。你指定一个10字节的字符串,然后是两个无符号的短路,然后是一个带符号的字节。如错误消息中所示,这最多可添加15个字节。你有一个45字节的缓冲区,所以你需要正确地指定缓冲区应包含的内容。