Ich hoffe sehr, dass dies keine bereits beantwortete oder eine dumme Frage sein wird. In letzter Zeit habe ich mit mehreren Geräten programmiert. Ich versuche, zwischen ihnen zu kommunizieren, um ein Testprogramm zu erstellen. Allerdings habe ich einige Probleme mit einem bestimmten Instrument, wenn ich versuche, Funktionen aufzurufen, die ich aus der DLL-Datei des Instruments "maskiert" habe. Wenn ich die interaktive Python-Shell verwende, funktioniert es perfekt (obwohl es eine Menge Wortklaubereien gibt). Aber wenn ich die Funktionen objektorientiert implementiere, schlägt das Programm fehl, nun ja, eigentlich schlägt es nicht fehl, es tut nur nichts. Dies ist die erste Methode, die aufgerufen wird: (ctypes und ctypes.util sind importiert)
def init_hardware(self):
""" Inits the instrument """
self.write_log("Initialising the automatic tuner")
version_string = create_string_buffer(80)
self.error_string = create_string_buffer(80)
self.name = "Maury MT982EU"
self.write_log("Tuner DLL path: %s", find_library('MLibTuners'))
self.maury = WinDLL('MlibTuners')
self.maury.get_tuner_driver_version(version_string)
if (version_string.value == ""):
self.write_log("IMPORTANT: Error obtaining the driver version")
else:
self.write_log("Version number of the DLL: %s" % version_string.value)
self.ThreeTypeLong = c_long * 3
Das funktioniert jetzt prima, alles ist perfekt und ich bekomme perfekte Log-Einträge. Aber wenn ich versuche, eine Methode weiter in das Programm genannt laufen:
def add_tuner_and_controller(self, name, serial_number, tuner_number=0):
""" Adds the tuner to the driver object, controller is inside the tuner """
self.write_log("Adding tuner %d and the built-in controller" % tuner_number)
TempType = self.ThreeTypeLong()
self.maury.add_controller(c_short(tuner_number), c_char_p(self.file_path), c_char_p(name), c_int(0), c_int(0),
c_long(0), c_short(serial_number), self.error_string)
self.maury.add_tuner(c_short(tuner_number), c_char_p(name), c_short(serial_number), c_short(0),
c_short(1), pointer(c_double()), TempType, pointer(c_double()), pointer(c_double()),
pointer(c_double()), self.error_string)
Das Programm hört plötzlich auf zu arbeiten/läuft weiter, nichts passiert, wenn die "self.maury"-Zeile aufgerufen wird. Wenn ich alles in der init_hardware-Methode platziere, funktioniert es perfekt, also vermute ich, dass es einen leichten Speicher-"Fehler" oder etwas mit der zielorientierten Struktur gibt. Ich möchte wirklich, dass es so bleibt. Gibt es eine Möglichkeit, die Funktionen auf diese Weise zu isolieren, oder muss ich mich auf einen großen Teil des Codes beschränken?
EDIT:
Informationen zur Dokumentation :
[Legende: Die Sterne stehen für Zeiger und die Klammern für Arrays.]
Die Funktion add_tuner fügt dem Tuner-Treiberobjekt einen Tuner hinzu oder aktualisiert ihn.
short add_tuner(short tuner_number, char model[ ], short serial_number, short ctlr_num, short ctlr_port, short *no_of_motors, long max_range[ ], double *fmin, double *fmax, double *fcrossover, char error_string[ ])
Sortie : no_motors, max_range (array of three numbers), fmin, fmax, fcrossover,error_string (80+ characters long), function-return->Error flag
Die Funktion add_controller fügt dem Tuner-Treiberobjekt einen Controller hinzu oder aktualisiert ihn
short add_controller(short controller_number, char driver[ ], char model[ ], int timeout, int address, long delay_ms, char error_string[ ])
Sortie : error_string, function-return->Error flag