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:

  1. # Codificar como bytes el número 12.4.
  2. >>> import struct
  3. >>> data = struct.pack("<f", 12.4)
  4. >>> type(data)
  5. <class 'bytes'>
  6. >>> len(data)
  7. 4
  8. >>> list(data)
  9. [102, 102, 70, 65]


Luego podés hacer:

  1. msg.DATA[0] = data[0]
  2. msg.DATA[1] = data[1]
  3. msg.DATA[2] = data[2]
  4. 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
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)