Pregunta

Este es un tipo de seguimiento de mi última pregunta si esto puede ayudarlo .

Estoy definiendo algunas estructuras ctype

class EthercatDatagram(Structure):
    _fields_ = [("header", EthercatDatagramHeader),
                ("packet_data_length", c_int),
                ("packet_data", POINTER(c_ubyte)),
                ("work_count", c_ushort)]

class EthercatPacket(Structure):
    _fields_ = [("ether_header", ETH_HEADER),
                ("Ethercat_header", EthercatHeader),
                ("data", POINTER(EthercatDatagram))]

tenga en cuenta que Python analiza esto correctamente, las clases que faltan se definen en otra parte. Mi problema es cuando llamo al siguiente código

packet = EthercatPacket()
ethercap.RecvPacket(byref(packet))
print packet.data.header

Esto es incorrecto. Según tengo entendido el problema, los datos son algún tipo de puntero, por lo que no están (realmente) asignados a EthercatDatagram, por lo tanto, el analizador no conoce el campo de encabezado subyacente.

¿hay alguna forma de leer ese campo, así como cualquier otro campo representado por POINTER ()?

¿Fue útil?

Solución 2

Ok, lo tengo funcionando

el código correcto era

print packet.data.header[0]

gracias a la 7 persona que se atrevió a mirar la pregunta

la cadena de google para la respuesta fue: puntero de referencia de tipo python ctype 3er golpe

Otros consejos

La notación de corchetes es correcta. Como referencia, aquí hay un fragmento de un código ctypes que hice recientemente:

class Message(Structure):
    _fields_ = [ ("id", BYTE), ("data", POINTER(BYTE)), ("data_length", DWORD) ]
    def __repr__(self):
        d = ' '.join(["0x%02X" % self.data[i] for i in range(self.data_length)])
        return "<Message: id = 0x%02X, " % (self.id) + "data_length = " + str(self.data_length) + (self.data_length > 0 and (", data: " + d) or "") + ">"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top