13.3.1.6. API-Referenz

Die öffentliche Schnittstelle des openmv-Pakets besteht aus der Klasse Camera für die Kommunikation mit einer Kamera und der OMVException-Hierarchie für Protokollfehler. Beide sind auf dieser Seite dokumentiert.

13.3.1.6.1. Die Camera-Klasse

class openmv.Camera(port: str, *, baudrate: int = 921600, crc: bool = True, seq: bool = True, ack: bool = True, events: bool = True, timeout: float = 1.0, max_retry: int = 3, max_payload: int = 4096, drop_rate: float = 0.0)

Der host-seitige Proxy für eine OpenMV Cam, der über USB-Serial erreicht wird.

Parameter:
  • port – Pfad zum seriellen Gerät. Unter Linux /dev/ttyACMx für USB CDC und /dev/ttyUSBx für eine USB-zu-UART-Bridge. Unter macOS /dev/tty.usbmodem... oder /dev/cu.usbmodem.... Unter Windows COMx.

  • baudrate – Serielle Baudrate. Über USB ist 921600 der magische Wert, der die Kamera vom MicroPython REPL auf das OpenMV-Protokoll umschaltet – jeder andere Wert auf einer USB-Verbindung belässt die Kamera im REPL-Modus, daher muss der Standardwert verwendet werden. Über eine UART-Verbindung ist der Wert die tatsächliche Leitungs-Baudrate und kann auf beiden Seiten frei festgelegt werden.

  • crc – Aktiviert die CRC-Validierung für jedes Paket.

  • seq – Aktiviert Sequenznummern pro Paket.

  • ack – Erfordert eine Paketbestätigung.

  • events – Aktiviert Ereignisbenachrichtigungen von der Kamera.

  • timeout – Zeitüberschreitung pro Operation in Sekunden.

  • max_retry – Anzahl der Wiederholungsversuche, bevor bei einem fehlgeschlagenen Paket eine Ausnahme ausgelöst wird.

  • max_payload – Maximale ausgehandelte Nutzlastgröße in Bytes. Die Kamera kann einen niedrigeren Wert aushandeln.

  • drop_rate – Nur zu Testzwecken: Wahrscheinlichkeit, ein Paket zu verwerfen, im Bereich [0.0, 1.0]. Im Produktivbetrieb auf 0.0 belassen.

Die Klasse unterstützt das Context-Manager-Protokoll; with Camera(port) as cam: ruft beim Eintritt connect() und beim Austritt disconnect() auf.

13.3.1.6.2. Verbindung

Camera.connect() None

Öffnet den seriellen Port und führt den Protokoll-Handshake durch. Zwischengespeicherter Zustand (Kanalliste, Systeminformationen, Versionsinformationen) wird als Nebeneffekt gefüllt. Wird vom Context Manager automatisch aufgerufen.

Camera.disconnect() None

Schließt den seriellen Port und gibt den Transport frei. Wird beim Beenden des Context Managers automatisch aufgerufen.

Camera.is_connected() bool
Rückgabe:

True, wenn der serielle Port geöffnet ist.

Camera.reset() None

Setzt die Kamera zurück. Die Verbindung wird getrennt, da die Kamera neu startet.

Camera.boot() None

Versetzt die Kamera in ihren Bootloader. Die Verbindung wird getrennt, da die Kamera neu startet.

Camera.update_capabilities() None

Handelt die Protokollfähigkeiten (CRC, Sequenzprüfung, ACKs, Ereignisse, maximale Nutzlast) mit der Kamera neu aus. Die Kamera meldet die maximale Nutzlast, die sie verarbeiten kann; die Anforderung des Hosts wird darauf beschränkt und die vereinbarten Einstellungen werden zurückgesendet. Wird von connect() automatisch aufgerufen – es gibt keinen Grund, sie aus dem Benutzercode aufzurufen, es sei denn, die Konstruktor-Flags müssen auf einer bestehenden Verbindung neu ausgehandelt werden.

Camera.poll_events() None

Führt den Empfangspfad des Transports einmal aus, um ausstehende Ereignisse von der Kamera zu verarbeiten, ohne einen Befehl zu senden. Nützlich in lang laufenden Programmen, die minutenlang ohne sonstige I/O auskommen und Kanalregistrierungsereignisse zeitnah erfassen möchten.

13.3.1.6.3. Skriptausführung

Camera.exec(script: str) None

Lädt script (eine Python-Quelltext-Zeichenkette) in den stdin-Puffer der Kamera hoch und startet die Ausführung.

Parameter:

script – Auszuführender MicroPython-Quelltext.

Camera.stop() None

Unterbricht das laufende Skript. Entspricht der Stop-Schaltfläche der IDE.

Camera.read_stdout() str | None

Liest die Bytes, die das laufende Skript seit dem letzten Aufruf in stdout geschrieben hat.

Rückgabe:

Die Ausgabe als dekodierte Zeichenkette oder None, wenn keine Daten anstehen.

13.3.1.6.4. Streaming

Camera.streaming(enable: bool, raw: bool = False, resolution: tuple[int, int] | None = None) None

Schaltet den Einzelbild-Stream ein oder aus und wählt das Übertragungsformat.

Parameter:
  • enableTrue aktiviert das Streaming, False deaktiviert es.

  • raw – Bei False (Standard) komprimiert die Kamera jedes Einzelbild als JPEG, bevor sie es in den Stream-Kanal stellt, und read_frame() dekomprimiert es auf dem Host. Bei True sendet die Kamera den erfassten Pixelpuffer unkomprimiert – die richtige Wahl bei Kameras ohne Hardware-JPEG-Unterstützung, bei denen die Software-Komprimierung der langsamste Schritt in der Schleife ist.

  • resolution(width, height): Zielgröße, auf die die Kamera jedes Roh-Einzelbild vor dem Senden herunterskaliert, da unkomprimierte Einzelbilder viel größer sind als JPEG-komprimierte. Erforderlich bei raw=True; andernfalls ignoriert.

Camera.read_frame() dict | None

Liest das neueste Einzelbild aus dem Stream-Kanal.

Rückgabe:

None, wenn kein Einzelbild ansteht, oder ein Dict mit den Schlüsseln width (int, Pixel), height (int, Pixel), format (int, der von der Kamera deklarierte Pixelformat-Bezeichner), depth (int, die komprimierte Bildgröße in Bytes für JPEG-/PNG-Einzelbilder; bei unkomprimierten Formaten ungenutzt), data (bytes, RGB888 der Länge width * height * 3) und raw_size (int, Bytes, die die Kamera vor dem Dekodieren über USB gesendet hat).

13.3.1.6.5. Benutzerdefinierte Kanäle

Camera.has_channel(name: str) bool
Rückgabe:

True, wenn auf der Kamera ein mit name registrierter Kanal existiert.

Camera.channel_size(name: str) int
Rückgabe:

Anzahl der Bytes, die der benannte Kanal derzeit verfügbar hat, oder 0, wenn der Kanal leer ist oder nicht existiert.

Camera.channel_read(name: str, size: int | None = None) bytes | None

Liest von einem benutzerdefinierten Kanal.

Parameter:
  • name – Kanalname, der vom kamera-seitigen Skript registriert wurde.

  • size – Zu lesende Bytes oder None, um alles Verfügbare zu lesen.

Rückgabe:

Die Bytes oder None, wenn der Kanal nicht existiert.

Camera.channel_write(name: str, data: bytes) bool

Schreibt data in einen benutzerdefinierten Kanal. Schreibvorgänge, die größer als die Nutzlast sind, werden automatisch auf mehrere Pakete aufgeteilt.

Parameter:
  • name – Kanalname, der vom kamera-seitigen Skript registriert wurde.

  • data – Zu sendende Bytes-artige Nutzlast.

Rückgabe:

True, wenn der Kanal existiert und der Schreibvorgang gesendet wurde, andernfalls False.

Camera.read_status() dict[str, bool]

Fragt jeden registrierten Kanal ab.

Rückgabe:

Dict, das den Kanalnamen auf einen booleschen Wert für „Daten sind zum Lesen bereit“ abbildet.

Camera.update_channels() None

Aktualisiert die zwischengespeicherte Kanalliste von der Kamera. Wird automatisch beim nächsten Mal ausgeführt, wenn eine Kanalsuche per Name durchgeführt wird, nachdem ein Kanalregistrierungsereignis eingetroffen ist; eine Anwendung, die einen neu registrierten Kanal sofort kennenlernen möchte, kann diese Methode direkt aufrufen.

Camera.get_channel(name: str | None = None, channel_id: int | None = None) int | str | None

Schlägt einen Kanal entweder per Name (mit Rückgabe seiner numerischen ID) oder per ID (mit Rückgabe seines Namens) nach. Aktualisiert zuvor den Kanal-Cache über update_channels(), falls Kanalregistrierungsereignisse ausstehen.

Parameter:
  • name – Kanalname, der zu einer ID aufgelöst werden soll.

  • channel_id – Kanal-ID, die zu einem Namen aufgelöst werden soll.

Rückgabe:

Die entsprechende ID oder der Name oder None, wenn der Kanal nicht existiert. Eines von name oder channel_id muss angegeben werden.

13.3.1.6.6. Geräte-Introspektion

Camera.version() dict

Gibt die Protokoll-, Bootloader- und Firmware-Versionstripel der Kamera zurück. Nach connect() zwischengespeichert. Jedes Tripel ist ein (major, minor, patch)-Tupel aus int:

  • protocol_version – die Version des OpenMV-Wire-Protokolls, die die Kamera implementiert.

  • bootloader_version – das im Flash residente Bootloader-Image.

  • firmware_version – die derzeit laufende MicroPython-Firmware.

Camera.system_info() dict

Gibt die Hardware-Fähigkeits- und Speicherinformationen der Kamera zurück. Nach connect() zwischengespeichert. Die Schlüssel des zurückgegebenen Dicts gliedern sich in vier Gruppen.

Identität

  • cpu_id – 32-Bit-CPU-Bezeichner.

  • device_id – 3-Tupel aus 32-Bit-Wörtern, die im Silizium fest eingebrannte eindeutige Geräteseriennummer.

  • chip_id – 3-Tupel aus 32-Bit-Wörtern, ein Eintrag pro an die Kamera angeschlossenem Bildsensor.

  • usb_vid – USB-Hersteller-ID.

  • usb_pid – USB-Produkt-ID.

Speichergrößen (alle in Kilobytes)

  • flash_size_kb – gesamter interner Flash.

  • ram_size_kb – gesamter RAM.

  • framebuffer_size_kb – für die Bilderfassung reservierter RAM.

  • stream_buffer_size_kb – RAM, der für den Stream-Kanal reserviert ist, der Einzelbilder an den Host sendet.

Fähigkeits-Flags (ein boolescher Wert pro Merkmal, alle benannt <feature>_present)

  • gpu_present – Grafikprozessor.

  • npu_present – neuronale Verarbeitungseinheit.

  • isp_present – Bildsignalprozessor.

  • venc_present – Video-Encoder.

  • jpeg_present – JPEG-Hardware-Encoder.

  • dram_present – externes DRAM.

  • crc_present – CRC-Beschleuniger.

  • pmu_present – Performance-Monitoring-Einheit.

  • wifi_present – Wi-Fi-Funkmodul.

  • bt_present – Bluetooth-Funkmodul.

  • sd_present – SD-Kartensteckplatz.

  • eth_present – Ethernet-PHY.

  • multicore_present – mehrere CPU-Kerne.

Sonstiges

  • usb_highspeed – boolesch, True, wenn USB im High-Speed-Modus (USB 2.0 HS, 480 Mbps) aufgezählt wurde.

  • pmu_eventcnt – Anzahl der verfügbaren PMU-Ereigniszähler; 0, wenn keine PMU vorhanden ist.

Camera.print_system_info() None

Protokolliert den formatierten Systeminformationsblock über logging auf der Stufe INFO. Die CLI verwendet dies bei der Verbindung.

13.3.1.6.7. Diagnose

Camera.host_stats() dict
Rückgabe:

Die auf der Host-Seite verfolgten Zähler der Transportschicht: sent, received, checksum, sequence.

Camera.device_stats() dict
Rückgabe:

Die auf der Kamera-Seite verfolgten Zähler der Transportschicht: sent, received, checksum, sequence, retransmit, transport, sent_events, max_ack_queue_depth.

13.3.1.6.8. Profiler

Der Profiler meldet pro Funktion die Aufrufanzahl sowie minimale/maximale/gesamte Ausführungszeiten für die instrumentierten Firmware-Module – derzeit image, ml und ulab. Funktionseintritt und -austritt werden zur Kompilierzeit abgefangen; die Laufzeit erfasst bei jedem davon einen monotonen Mikrosekundenzähler, akkumuliert das Ergebnis pro Funktion und stellt die Tabelle dem Host über den profile-Kanal zur Verfügung.

Der Profiler wird nur in die Firmware eingebaut, wenn PROFILE_ENABLE=1 an make übergeben wird. Standard-Firmware-Images enthalten ihn nicht – das Flag -finstrument-functions, das der Build den verfolgten Modulen hinzufügt, hat einen nicht unerheblichen Laufzeit-Overhead, daher werden Profiling-Builds aus dem Quellcode für die spezifische Debugging-Sitzung erstellt, die sie benötigt. Wenn die Firmware nicht mit dem Flag erstellt wurde, wird der profile-Kanal nicht registriert und jede Profiler-Methode auf dieser Seite kehrt stillschweigend zurück, ohne etwas zu tun.

Die Arm Performance Monitoring Unit (PMU) ist der Hardware-Zählerblock des Cortex-M55 – ein kleiner Satz konfigurierbarer Zähler, die Zyklenzahlen, Cache-Treffer und -Fehler, Sprungverhalten und andere architekturdefinierte Ereignisse erfassen, ohne den gemessenen Code zu verlangsamen. Auf Kameras, die eine besitzen – der AE3 und der N6, den beiden Kameras im OpenMV-Sortiment, die um den M55 herum aufgebaut sind –, erfasst der Profiler diese Zähler zusammen mit den Zeitdaten, und die Ereignissummen erscheinen in jedem Datensatz pro Funktion. Kameras ohne PMU erzeugen weiterhin Zeitdatensätze; die Ereignisfelder kommen als Null zurück und profiler_event() ist eine No-Op.

Camera.profiler_mode(exclusive: bool = False) None

Wechselt zwischen inklusiver und exklusiver Zeitmessung. Inklusive Zeitmessung rechnet die Zeit der aufgerufenen Funktionen dem Aufrufer zu; exklusive Zeitmessung tut dies nicht.

Parameter:

exclusiveTrue wählt exklusive Zeitmessung, False wählt inklusive.

Camera.profiler_reset(config: list | None = None) None

Setzt alle Profilzähler zurück. config=None stellt außerdem die standardmäßige PMU-Ereigniszuweisung wieder her.

Parameter:

config – Reserviert für zukünftige Konfigurationsüberschreibungen pro Zähler. Übergeben Sie None, um die Standardwerte beizubehalten.

Camera.profiler_event(counter_num: int, event_id: int) None

Bindet einen der PMU-Zählerslots an ein bestimmtes Hardware-Ereignis.

Parameter:
  • counter_num – Zählerindex.

  • event_id – Architekturdefinierter Ereignisbezeichner.

Camera.read_profile() list[dict] | None

Gibt die Profildatensätze pro Funktion zurück, die seit dem letzten Zurücksetzen gesammelt wurden. Jeder Datensatz ist ein Dict mit address, caller, call_count, min_ticks, max_ticks, total_ticks, total_cycles und einem events-Tupel der Größe von pmu_eventcnt der Kamera.

Rückgabe:

Liste von Datensatz-Dicts oder None, wenn der Profilkanal nicht verfügbar ist oder keine Daten gesammelt wurden.

13.3.1.6.9. Unterklassenbildung und Kanal-Interna

Die oben dokumentierten Methoden decken jede gängige Verwendung des Pakets ab. Einige Muster – das Behandeln kamera-seitiger Ereignisse, auf die der Host reagieren möchte, das Sperren eines Kanals für einen mehrstufigen Austausch, die Kommunikation mit Kanälen, die strukturierte Daten anstelle von Byte-Streams übertragen, oder das Ansteuern kanalspezifischer Steuerbefehle – benötigen Methoden, die Camera mit einem Unterstrich-Präfix versieht. Diese Namen sind privat per Konvention (Python führt kein Name-Mangling durch), und von Anwendungen, die sie benötigen, wird erwartet, dass sie entweder von Camera ableiten oder die Methoden direkt aufrufen.

Unterklassenbildung zur Reaktion auf Ereignisse. Jedes von der Kamera ausgegebene Ereignis kommt über Camera._handle_event() an. Das Ableiten von Camera und Überschreiben der Methode ist der Weg, auf dem eine Anwendung auf Ereignisse reagiert, die ihr kamera-seitiges Skript auslöst; die Seite Ereignisse beschreibt das vollständige Muster.

Camera._handle_event(channel_id: int, event: int) None

Versendet ein Ereignis von der Kamera. Wird von der Transportschicht aufgerufen, sobald ein Ereignispaket eintrifft. In einer Unterklasse überschreiben, um anwendungsspezifische Behandlung hinzuzufügen; rufen Sie super()._handle_event(...) auf, um das Standardverhalten beizubehalten (Kanallisten-Aktualisierung bei CHANNEL_REGISTERED, Frame-Ready-Verfolgung auf dem stream-Kanal, stdin-Kanal-Start-/Stopp-Protokollierung).

Parameter:
  • channel_id0 für Systemereignisse, andernfalls die registrierte Kanal-ID.

  • event – Ereignisbezeichner; die Werte stammen für Systemereignisse aus der EventType-Enumeration und für Kanalereignisse aus dem, was das kamera-seitige Kanal-Backend gewählt hat.

Eine Unterklasse, die ihre eigenen protokollsprechenden Methoden hinzufügt, sollte sie mit retry_if_failed() dekorieren, damit sie dasselbe Resync-und-Wiederholungs-Verhalten erben, das jede ausgelieferte Methode auf dieser Seite besitzt.

static Camera.retry_if_failed(func)

Dekorator. Umschließt eine Instanzmethode, sodass sie einmal wiederholt wird, wenn der Transport eine ResyncException auslöst. Jede Methode, die _send_cmd_wait_resp() aufruft (direkt oder über einen der _channel_*-Wrapper), sollte diesen Dekorator tragen:

class MyCamera(Camera):
    @Camera.retry_if_failed
    def my_custom_command(self, payload):
        return self._send_cmd_wait_resp(Opcode.MY_CMD,
                                        0, payload)

Kanalsperrung stellt sicher, dass sich der Zustand des Kanals zwischen zwei zusammengehörigen Operationen nicht ändert (zum Beispiel ein _channel_size() gefolgt von einem _channel_read() auf einem Kanal, der ständig Daten anhängt). read_frame() und read_profile() verwenden dies intern; eine Anwendung, die einen benutzerdefinierten Kanal mit mehrstufigem Zugriff ansteuert, tut dasselbe.

Camera._channel_lock(channel_id: int) bool

Erwirbt eine exklusive Sperre auf einem Kanal. Andere Host-Operationen auf demselben Kanal blockieren, bis die Sperre freigegeben wird.

Parameter:

channel_id – Numerische Kanal-ID, typischerweise mit get_channel() aufgelöst.

Rückgabe:

True, wenn die Sperre gewährt wurde.

Camera._channel_unlock(channel_id: int) bool

Gibt eine zuvor mit _channel_lock() erworbene Sperre frei. Immer mit einem Sperraufruf gepaart; verwenden Sie try / finally, um sicherzustellen, dass die Entsperrung auch dann erfolgt, wenn das dazwischenliegende Lesen eine Ausnahme auslöst.

Parameter:

channel_id – Numerische Kanal-ID, typischerweise mit get_channel() aufgelöst.

Geformte Kanäle übertragen strukturierte Datensätze anstelle eines flachen Byte-Streams. Der Profilerkanal ist das ausgelieferte Beispiel: seine Form ist (record_count, record_size) und ein Host, der wissen möchte, wie viele Datensätze anstehen, liest die Form anstelle der Byte-Größe.

Camera._channel_shape(channel_id: int) tuple[int, ...]

Liest den Form-Deskriptor eines Kanals.

Parameter:

channel_id – Numerische Kanal-ID, typischerweise mit get_channel() aufgelöst.

Rückgabe:

Tupel aus vorzeichenlosen 32-Bit-Ganzzahlen, das das Layout des Kanals beschreibt. Die Bedeutung ist kanalspezifisch.

Kanalspezifische Steuerbefehle – Start, Stopp, Reset, Konfiguration – nutzen einen einzigen Opcode (CHANNEL_IOCTL) mit einer kanalspezifischen Befehlsnummer und einer optionalen struct.pack-Nutzlast. Die ausgelieferten Methoden wie stop(), exec() und streaming() sind dünne Wrapper um _channel_ioctl()-Aufrufe gegen die Kanäle stdin und stream; ein benutzerdefinierter kamera-seitiger Kanal, der sein eigenes ioctl-Menü definiert, wird auf dieselbe Weise angesteuert.

Camera._channel_ioctl(channel_id: int, cmd: int, fmt: str | None = None, *args) bytes | None

Setzt einen ioctl-Befehl auf einem Kanal ab.

Parameter:
  • channel_id – Numerische Kanal-ID, typischerweise mit get_channel() aufgelöst.

  • cmd – Vom kamera-seitigen Kanal-Backend definierte Befehlsnummer.

  • fmt – Optionaler struct-Formatstring für das Argument-Tupel. Übergeben Sie None für ioctls, die keine Argumente annehmen.

  • args – Werte, die zu fmt passen.

Rückgabe:

Die vom Kanal zurückgegebene Nutzlast oder None.

By-ID-Byte-Stream-Varianten der öffentlichen Kanalmethoden überspringen die Name-zu-ID-Suche und akzeptieren einen expliziten Byte-offset – nützlich, um einen Abschnitt aus der Mitte eines großen Puffers zu lesen (zum Beispiel die Datensätze des profile-Kanals).

Camera._channel_size(channel_id: int) int
Parameter:

channel_id – Numerische Kanal-ID, typischerweise mit get_channel() aufgelöst.

Rückgabe:

Aktuell auf dem Kanal verfügbare Bytes.

Camera._channel_read(channel_id: int, offset: int, length: int) bytes

Liest length Bytes ab offset. Mehr-Paket-Lesevorgänge werden automatisch wieder zusammengesetzt.

Parameter:
  • channel_id – Numerische Kanal-ID, typischerweise mit get_channel() aufgelöst.

  • offset – Byte-Offset, ab dem das Lesen beginnt.

  • length – Anzahl der zu lesenden Bytes.

Camera._channel_write(channel_id: int, data: bytes, offset: int = 0) None

Schreibt data an den angegebenen offset. Mehr-Paket-Schreibvorgänge werden automatisch auf mehrere Pakete aufgeteilt.

Parameter:
  • channel_id – Numerische Kanal-ID, typischerweise mit get_channel() aufgelöst.

  • data – Zu schreibende Bytes-artige Nutzlast.

  • offset – Byte-Offset, ab dem das Schreiben beginnt.

Protokoll-Primitive sind die unterste Ebene, die die Klasse offenlegt – die rohen Einträge zum Senden eines Befehls, zum Abrufen der rohen Kanalliste und zum manuellen Resync, auf denen alles Obige letztlich aufbaut. Eine Anwendung greift darauf zurück, wenn sie einen Opcode sendet, den die Klasse noch nicht umschließt, oder wenn sie in einer Unterklasse eine benutzerdefinierte Wiederherstellung implementiert.

Camera._send_cmd_wait_resp(opcode: int, channel: int = 0, data: bytes = b'') bytes | None

Sendet einen Protokollbefehl und wartet auf die Antwort der Kamera. Das Primitiv, auf dem jede andere Methode in diesem Abschnitt aufbaut.

Parameter:
  • opcode – Befehlsnummer. Die ausgelieferte Opcode-Enumeration listet die Codes auf, mit denen die Firmware geliefert wird, aber der Parameter ist lediglich eine Ganzzahl – ein benutzerdefinierter Firmware-Build kann seine eigenen definieren und darauf antworten.

  • channel – Kanal-ID oder 0 für Systembefehle.

  • data – Befehlsspezifische Nutzlast.

Rückgabe:

Antwort-Nutzlast oder None für Befehle wie Opcode.SYS_RESET und Opcode.SYS_BOOT, die die Verbindung trennen.

Camera._channel_list() dict

Ruft die aktuelle Kanalliste von der Kamera ab, ohne die zwischengespeicherten Dictionaries channels_by_id und channels_by_name zu berühren, die update_channels() füllt. Nützlich für eine Unterklasse, die den Kanalzustand der Kamera direkt inspizieren möchte.

Rückgabe:

Dict, das die Kanal-ID auf {'name': str, 'flags': int} abbildet.

Camera._resync() None

Führt den Protokoll-Handshake von Grund auf neu aus. Wird von connect() bei der ersten Verbindung automatisch aufgerufen sowie von jeder öffentlichen Methode, die eine OMVException vom Transport abfängt. Eine Anwendung, die in einer Unterklasse ihre eigene Wiederherstellungsschleife implementiert, kann diese Methode direkt nach der Behandlung des zugrunde liegenden Fehlers aufrufen.

13.3.1.6.10. Ausnahmen

exception openmv.OMVException

Basisklasse für jeden Fehler auf Protokollebene. Die drei untenstehenden Unterklassen erben alle von ihr, sodass ein einziges except OMVException die gesamte Fehleroberfläche abdeckt.

exception openmv.TimeoutException

Die Kamera hat nicht innerhalb der konfigurierten Zeitüberschreitung geantwortet. Unterklasse von OMVException.

exception openmv.ChecksumException

Die CRC eines Pakets stimmte nicht überein. Wird ausgelöst, nachdem das Protokoll sein Wiederholungsbudget erschöpft hat. Unterklasse von OMVException.

exception openmv.SequenceException

Ein Paket traf nach Wiederholungen mit einer unerwarteten Sequenznummer ein. Unterklasse von OMVException.