ctypes pointer problem

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
mindthegap
User
Beiträge: 3
Registriert: Montag 19. Oktober 2015, 13:46

Montag 19. Februar 2018, 19:54

hallo,

ich bin zum ersten mal an ctypes dran, hoppla das ist mühsam.

ich habe ein winDLL mit folgendem prototype:

Code: Alles auswählen

int FEISC_0xB0_ISOCmd( int iReaderHnd, unsigned char cBusAdr, unsigned char* cReqData, int iReqLen, unsigned char* cRspData, int* iRspLen, int iDataFormat )
die argtypes habe ich gesetzt:

Code: Alles auswählen

feisc.FEISC_0xB0_ISOCmd.argtypes = c_int, c_ubyte, c_char_p, c_int, c_char_p, c_int, c_int
feisc.FEISC_0xB0_ISOCmd.restype = c_int
blöd ist halt daß der iRspint nicht als Pointer übergeben werden kann. wie mach ich das? die cRspData sollen 512 Byte sein das mache ich mit

Code: Alles auswählen

rspData = create_string_buffer(512)
rspLeng = 0 #(c_int())
und hier der Aufruf:

Code: Alles auswählen

iBack = feisc.FEISC_0xB0_ISOCmd(iReader, 255, b'0100', 4, rspData, rspLeng, 0x01)
ich denke der Fehler "POINTER_IS_NUL" der dll deutet ja irgendwie auf die beiden response Pointer hin... aber wie übergebe ich die ordnetlich.
wie sieht das aus?

grüße
__deets__
User
Beiträge: 3117
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 19. Februar 2018, 20:01

pointer(rsp_len) oder byref(rsp_len) solltens tun. Ich glaube für deine Fall ist letzteres die bessere Wahl, weil weniger overhead. Der Unterschied war glaube ich das bei Pointer ein “dickes” Objekt erzeugt wird, und byref sagt “nur den Pointer für den call”. Wenn du den also nicht mehr brauchst, ist byref ausreichend.

Oh, und natürlich auch für die eigentlichen Buffer!
__deets__
User
Beiträge: 3117
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 19. Februar 2018, 20:04

Nachtrag: ob das so mit dem bytestring als req_data klappt bin ich mir auch nicht so sicher. Das solltest du bei Problemen mal ändern, oder in der Doku lesen wie da eine implizite typwandlung vorgenommen wird.
mindthegap
User
Beiträge: 3
Registriert: Montag 19. Oktober 2015, 13:46

Montag 19. Februar 2018, 20:18

ok,

wenn ich die argtypes vorab setze:
feisc.FEISC_0xB0_ISOCmd.argtypes = c_int, c_ubyte, c_char_p, c_int, c_char_p, POINTER(c_int), c_int

habe ich nicht den fehler mit dem POINTER_IS_NUL. dafür einen neuen. wie würde das denn aussehen wenn es richtig wäre, kann mit das nicht vorstellen, oder kommt das bei der Funktion?
__deets__
User
Beiträge: 3117
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 19. Februar 2018, 20:49

Was ist denn der Fehler? Ich liege krank im Bett & die Glaskugel ist im anderen Zimmer. Außerdem schlag mal,byref in der Doku nach, da wird das garantiert erklärt.
Antworten