문제

이것은 일종의 후속 조치입니다 내 마지막 질문 이것이 당신을 도울 수 있다면.

몇 가지 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))]

이것은 Python에 의해 올바르게 구문 분석되며 누락 된 클래스는 다른 곳에 정의됩니다. 내 문제는 다음 코드를 호출 할 때입니다

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

이것은 잘못되었습니다. 문제를 이해 하듯이 데이터는 일종의 포인터이므로 Ethercatdatagram에 (실제로) 맵핑되지 않으므로 구문 분석기는 기본 헤더 필드를 알지 못합니다.

Pointer ()로 표시되는 다른 필드뿐만 아니라 해당 필드를 읽을 수있는 방법이 있습니까?

도움이 되었습니까?

해결책 2

알았어

올바른 코드였습니다

print packet.data.header[0]

감히 질문을 보려고 한 7 명에게 감사드립니다.

답을위한 Google 문자열은 다음과 같습니다. Python Ctype Dereference Pointer 3rd Hit

다른 팁

제곱 브래킷 표기법은 실제로 정확합니다. 참고로, 여기에 내가 최근에 만든 일부 CTYPES 코드의 스 니펫이 있습니다.

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 "") + ">"
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top