ValueError: literal no válido para int () con base 16: ‘\ x0e \ xa3’ Python

Obtengo bytes del puerto serie que representa el voltaje en mi placa PIC. Pero no puedo convertir estos bytes (cadenas) a decimal porque aparece el mensaje de error anterior. Aquí está la función (de hecho, está asociada con el botón tkinter)

def channel8(): ser.write(chr(0xFF)) print "you have select channel8" x=ser.read(2) w=int(x, 16) print w print "Voltage on channel8 is:" , x 

ValueError: literal no válido para int () con base 16: ‘\ x0e \ xa3’

 def channel8(): ser.write(chr(0xFF)) print "you have select channel8" x=ser.read(2) z=struct.unpack("h", x) #w=int(z, 16) print z 

y me sale esto:

El voltaje en el canal 8 es: (28942,)

¿Puede por favor explicar cómo obtuve este valor? no está emparejando nada: D

Creo que deberías usar el módulo struct y desempaquetar tus datos binarios de esta manera:

 struct.unpack("h", x) 

Porque int no funciona realmente con datos binarios, sino con una cadena hexadecimal como: EF1D .

Cuando hiciste x=ser.read(2) recibiste dos bytes de datos binarios, hay dos tipos de representación numérica admitidos por la biblioteca struct : short (h) y unsigned short (H). La función struct.unpack recibe dos argumentos:

  • especificación de la estructura (una cadena de caracteres de formato )
  • datos binarios

y devuelve una tupla con valores desempaquetados (solo un int en su caso).

Por lo tanto, necesita cambiar la cadena w=int(x, 16) por w = struct.unpack("h", x)[0] o w = struct.unpack("H", x)[0] , depende de tipo de datos.