2015-09-18 8 views
5

SfondoCome passare un elenco di pitone alla funzione C (DLL) che utilizzano ctypes

ho qualche software di analisi in Python devo passare un elenco di 4096 byte (che assomiglia a questo[80, 56, 49, 50, 229, 55, 55, 0, 77, ......]) ad un dll, in modo che la dll lo scriva su un dispositivo.

  1. I byte da scrivere sono memorizzati nei dati di nome variabile
  2. la funzione C (DLL) che deve essere chiamato da pitone è

    int _DLL_BUILD_ IO_DataWrite(HANDLE hDevice, unsigned char* p_pBuff, unsigned char p_nByteCntInBuff);

  3. ho accesso al codice dll

Metodo provato

ho cercato di dichiarare un tipo di dati

data_tx = (ctypes.c_uint8 * len(data))(*data) 

e richiama la funzione

ret = self.sisdll.IO_DataWrite(self.handle, ctypes.byref(data_tx), ctypes.c_uint8(pending_bytes)) 

Problemi

Non sembra esserci alcun errore ma il relativo funzionamento. La chiamata API funziona con C e C++.

Sto facendo questo corretto. Qualcuno potrebbe gentilmente indicare l'errore per me?

+0

Avete provato a definire i tipi di argomento: 'IO_DataWrite.argtypes = [c_void_p, POINTER (c_uint8), c_uint8]'? –

+1

Di solito, faccio 'data_tx = (ctypes.c_uint8 * len (data))()' e successivamente copio i dati nell'array e chiamiamo la libreria usando 'ctypes.byref'. Puoi provare questo invece di costruire il tuo array dai dati –

+0

@JensMunk Trasformalo in una risposta, è la risposta giusta – zwol

risposta

5

Ciò che si tenta di ottenere può essere fatto in questo modo.

intestazione interfaccia, dicono functions.h

#include <stdint.h> 
#include "functions_export.h" // Defining FUNCTIONS_API 
FUNCTIONS_API int GetSomeData(uint32_t output[32]); 

sorgente C, functions.c

#include "functions.h" 
int GetSomeData(uint32_t output[32]) { 
    output[0] = 37; 
} 

in Python, è sufficiente scrivere

import ctypes 
hDLL = ctypes.cdll.LoadLibrary("functions.dll") 
output = (ctypes.c_uint32 * 32)() 
hDLL.GetSomeData(ctypes.byref(output)) 
print(output[0]) 

Si dovrebbe vedere il numero 37 stampato sullo schermo.