Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Problema al pasar un data floatante a bytes
#1
Hola,
Estoy haciendo un script en Python que envía un mensaje CAN a través de un PCAN-USB. El problema está que cuando quiero enviar un mensaje con datos flotantes me salé este error: 
<TypeError: unsupported operand type(s) for >>: 'float' and 'int'>

Este es mi código:
Código:
connect1 = PCANBasic()

# Initialize connection
res = connect1.Initialize(PCAN_USBBUS1,
PCAN_BAUD_500K,
TPCANType(0),0,0)
       
msg = TPCANMsg()
msg.ID = 0xW8
msg.MSGTYPE = PCAN_MESSAGE_STANDARD  
msg.LEN = 8
       
msg.DATA[0] = (12.4>> 24) & 0xff #Error aqui
msg.DATA[1] = (12.4 >> 16) & 0xff
msg.DATA[2] = (12.4 >> 8) & 0xff
msg.DATA[3] = (12.4) & 0xff
       
msg.DATA[4] = (35.4 >> 24) & 0xff
msg.DATA[5] = (35.4 >> 16) & 0xff
msg.DATA[6] = (35.4 >> 8) & 0xff
msg.DATA[7] = (35.4) & 0xff


result = connect1.Write(PCAN_USBBUS1,msg)
if result != PCAN_ERROR_OK:
    # An error occurred, get a text describing the error and show it
    #
    result = connect1.GetErrorText(result,0x00)
    print(result)
else:
    print("VP_POSITION : Message sent successfully")
           
       
res = connect1.Uninitialize(PCAN_USBBUS1)

Sé que un mensaje CAN puede manejar hasta 8 bytes, y un dato float ocupa 4 bytes si no estoy confundido. Alguien sabe como podría solucionar este problema ?

Gracias de antemano.
Responder
#2
Hola, bienvenido.

El operador >> (bitwise shift) no puede aplicarse sobre números de coma flotante. Si querés representar un float como un conjunto de bytes, te recomiendo que lo hagas vía el módulo estándar struct:

Código:
# Codificar como bytes el número 12.4.
>>> import struct
>>> data = struct.pack("<f", 12.4)
>>> type(data)
<class 'bytes'>
>>> len(data)
4
>>> list(data)
[102, 102, 70, 65]

Luego podés hacer:

Código:
msg.DATA[0] = data[0]
msg.DATA[1] = data[1]
msg.DATA[2] = data[2]
msg.DATA[3] = data[3]

Chequeá la documentación del módulo struct para asegurarte de usar el formato correcto según la especificación del hardware al cual estás enviando los datos. En el ejemplo, "<f" codifica un float de 4-bytes usando little-endian.

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)