在Python中对列表重新排序,以确保它以检查值开头
我使用Pyserial读取串行数据,以256Hz的采样率填充17个值(每个值1字节)的列表 我最终想要使用的字节是列表中的第5到第8个字节。如果不删除任何字节,则流的前两个值始终相同('165','90')。但是我得到了很多被删除的值,并且我的列表值正在移动,所以当我读取第5-8字节时,它们不是正确的值 我已经部分地解决了这一问题,确保在捕获想要的序列之前,根据它们应该是什么来检查前几个值(即,如果mylist[0]==165&..。在Python中对列表重新排序,以确保它以检查值开头,python,list,Python,List,我使用Pyserial读取串行数据,以256Hz的采样率填充17个值(每个值1字节)的列表 我最终想要使用的字节是列表中的第5到第8个字节。如果不删除任何字节,则流的前两个值始终相同('165','90')。但是我得到了很多被删除的值,并且我的列表值正在移动,所以当我读取第5-8字节时,它们不是正确的值 我已经部分地解决了这一问题,确保在捕获想要的序列之前,根据它们应该是什么来检查前几个值(即,如果mylist[0]==165&..。 这是粗略的,但还可以,因为这两个值在其他地方的列表中彼此相邻
这是粗略的,但还可以,因为这两个值在其他地方的列表中彼此相邻的可能性很小。 问题是,这意味着一旦字节移位,我就会丢失一堆值,直到它最终重新对齐 我的问题是:我可以使用什么代码来: a) 一旦检测到列表不再以165,90开头,则强制列表重新对齐。(elif…) b) 检测“165”和“90”在列表中的位置(彼此相邻),并根据它们的位置提取我想要的值(下一个但一个,以后) 提前谢谢 美国 刚刚从相关的Qs中注意到我可以使用
mylist.append(mylist.pop(0))
多次,直到他们在正确的地方。有没有更好的建议?如果我能很好地理解你, 假设您有这样一个列表:
l = [67, 126, 165, 90, 11, 1, 3, 5, 151, 99, 23]
while True:
mylist.extend(get_more_data())
# If we're misaligned, skip bytes until we're aligned again
while mylist and mylist[0] != 165 or mylist[1] != 90:
mylist.pop(0)
# If we've skip bytes, we might not have enough data, so get more
if len(mylist) < 17:
continue
# Process one chunk of data and remove it from the list
process_data(mylist[:17])
del mylist[:17]
您希望获得:
有用=[3,5151,99]
然后,你可以做:
# obtain places where 165 is followed by 90
match = [x for x in xrange(len(l)-1) if l[x]==165 and l[x+1]==90]
# obtain range of useful values
useful = l[match[0]+4:match[0]+8]
如果我误解了你的问题,你可能得调整一下数字。
希望有帮助
Manuel如果我理解您的问题是正确的,您的数据将以17字节的块连续到达。假设这是对的,像这样的事情怎么样:
l = [67, 126, 165, 90, 11, 1, 3, 5, 151, 99, 23]
while True:
mylist.extend(get_more_data())
# If we're misaligned, skip bytes until we're aligned again
while mylist and mylist[0] != 165 or mylist[1] != 90:
mylist.pop(0)
# If we've skip bytes, we might not have enough data, so get more
if len(mylist) < 17:
continue
# Process one chunk of data and remove it from the list
process_data(mylist[:17])
del mylist[:17]
为True时:
扩展(获取更多数据())
#如果未对齐,请跳过字节,直到再次对齐为止
而mylist和mylist[0]!=165或mylist[1]!=90:
mylist.pop(0)
#如果我们跳过了字节,我们可能没有足够的数据,所以获取更多
如果len(mylist)<17:
持续
#处理一个数据块并将其从列表中删除
处理数据(mylist[:17])
德尔迈利斯特[:17]
我将使用165和90作为头值,始终检查传入字节是否匹配。此解决方案自动重新同步自身,其简单程度如下:
def get_message():
while True: #Some timeout functionality is useful here ;-)
message = []
byte = xxx.get_byte()
if byte == 165:
byte = xxx.get_byte()
if byte == 90:
xxx.get_byte() #drop it
xxx.get_byte() #drop it
message[0] = xxx.get_byte()
message[1] = xxx.get_byte()
message[2] = xxx.get_byte()
message[3] = xxx.get_byte()
#Break out of loop. We have a message!
return message
如果你设计两面,你真的应该插入一些校验和。如果你只是黑客的东西,在字节中寻找一个校验和。它可能已经存在了。您确实需要解决删除这么多字节的原因。如果将字节放在(165,90)之后,会发生什么情况?您将得到第6-9个字节,这将是垃圾。您使用的是高质量的串行电缆吗?它有多长?问题在于它是一个RS232-USB适配器,它也只有1英尺长!干杯