2010-03-05 5 views
5

Estoy leyendo datos en serie usando Pyserial, para completar una lista de 17 valores (1 byte cada uno) a una velocidad de muestreo de 256Hz.Reordenar lista en Python para asegurar que comienza con valores de verificación

Los bytes que quiero usar en última instancia son los 5 a 8 en la lista. Si no se eliminan los bytes, los primeros dos valores de la secuencia son siempre los mismos ('165', '90'). Sin embargo, estoy obteniendo bastantes valores descartados, y mis valores de lista están cambiando, así que cuando leo los bytes 5º a 8º, no son los valores correctos.

Combatí parcialmente esto asegurándome de que antes de capturar el segement deseado, los primeros valores se comparan con los que deberían (es decir, si mylist [0] == 165 & ....).
Esto es tosco, pero está bien, ya que las posibilidades de que estos dos valores aparezcan uno junto al otro en la lista en otro lugar son pequeños. El problema es que esto significa que tan pronto como los bytes cambien, perderé una carga de valores, hasta que finalmente se realinee.

Mi pregunta es: ¿qué código puedo usar para cualquiera:

a) Fuerza de la lista para realinear una vez que se ha detectado que ya no empieza con 165,90. (elif ....).

b) Detecte dónde '165' & '90' están (uno junto al otro) en la lista y extraiga los valores que quiero en relación con su posición (siguiente pero uno, en adelante).

Gracias de antemano

S_S

acabo de dar cuenta de las Qs relacionados que podría utilizar

mylist.append(mylist.pop(0)) 

varias veces hasta que estén en el lugar correcto. ¿Hay alguna manera mejor que alguien pueda sugerir?

+0

Realmente necesita abordar la razón por la que está bajando tantos bytes. ¿Qué sucede si deja caer el byte después (165,90)? Obtendrá los bytes 6º-9º que serán basura. ¿Estás usando un cable serial de buena calidad? ¿Cuánto tiempo es? –

+0

¡El problema del problema reside en el hecho de que es un adaptador RS232-USB, también mide 1 pie de largo! Aclamaciones. –

Respuesta

2

En caso de que le he entendido bien, suponga que tiene una lista como esta:

l = [67, 126, 165, 90, 11, 1, 3, 5, 151, 99, 23] 

Lo que quiere obtener: útil = [3,5,151,99]

Entonces, usted podría hacer:

# 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] 

Es posible que tenga que ajustar los números en caso de que no he entendido bien su problema. creo que sirve,

Manuel

0

Si entiendo su problema correcta, tiene datos que llegan de forma continua, en trozos de 17 bytes. Suponiendo que sea adecuado, ¿qué tal algo como esto:

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] 
0

me gustaría utilizar el 165 y el 90 como valores de cabecera, siempre vigilando el byte de entrada para un partido. Esta solución re-sincroniza automáticamente y es tan simple como:

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 

Si el diseño de ambos lados, que realmente debe insertar algún tipo de suma de comprobación. Si estás pirateando algo, busca en los bytes una suma de comprobación. Probablemente ya esté allí.

Cuestiones relacionadas