Scanner-Einstellungen über die REPL ändern
Was dieses Beispiel zeigt
Ein Menü in der REPL steuert den Scanner während des Betriebs: Scan starten und stoppen, die weiße Beleuchtung und das rote Zielllicht ein- und ausschalten, festlegen, welcher Anteil des Kamerabilds nach einem Code durchsucht wird, den manuellen, den kontinuierlichen oder den Motion-Sense-Lesemodus wählen sowie die Symbologiegruppen 1D und 2D ein- und ausschalten. Codes, die Sie scannen, während ein Menü wartet, werden weiterhin ausgegeben.
Verbinden Sie Pin 5 (TX) des Controllers mit RX des Scanners und Pin 4 (RX) mit TX des Scanners, dazu 3V3 und GND, oder ändern Sie tx und rx passend zu Ihrer Verdrahtung. Stellen Sie den Scanner zuerst auf UART um, indem Sie den Konfigurationsbarcode POR232 scannen.
Das Beispiel liest die Eingabe der REPL über uselect und sys ohne Blockieren. Beide gehören nicht zum Modul de2120; siehe die select-Dokumentation von MicroPython.
Der Beispielcode
import sys
import uselect
from de2120 import DE2120
import time
scanner = DE2120(tx=5, rx=4)
if not scanner.begin():
print("Scanner did not respond. Check wiring. Did you scan the POR232 barcode?")
raise SystemExit
print("Scanner online!")
poll = uselect.poll()
poll.register(sys.stdin, uselect.POLLIN)
def stdin_available():
return bool(poll.poll(0))
def flush_stdin():
while stdin_available():
sys.stdin.read(1)
def wait_for_key():
"""Block until a key is typed, printing any scanned barcodes in the meantime."""
while not stdin_available():
barcode = scanner.readBarcode()
if barcode:
print("...")
print("Code found:", barcode)
time.sleep_ms(200)
return sys.stdin.read(1)
def menu_flashlight():
flush_stdin()
print()
print("-------------------------------------")
print("1) Enable Flashlight")
print("2) Disable Flashlight")
print("-------------------------------------")
print("Select an option number:")
cmd = wait_for_key()
if cmd == "1":
print("White scan light on")
scanner.lightOn()
elif cmd == "2":
print("White scan light off")
scanner.lightOff()
else:
print("Command not recognized")
def menu_reticle():
flush_stdin()
print()
print("-------------------------------------")
print("1) Enable Reticle")
print("2) Disable Reticle")
print("-------------------------------------")
print("Select an option number:")
cmd = wait_for_key()
if cmd == "1":
print("Red scan reticle on")
scanner.reticleOn()
elif cmd == "2":
print("Red scan reticle off")
scanner.reticleOff()
else:
print("Command not recognized")
def menu_reading_area():
flush_stdin()
print()
print("-------------------------------------")
print("1) Full Width (Default)")
print("2) Center 80%")
print("3) Center 60%")
print("4) Center 40%")
print("5) Center 20%")
print("-------------------------------------")
print("Select an option number:")
cmd = wait_for_key()
areas = {"1": 100, "2": 80, "3": 60, "4": 40, "5": 20}
if cmd in areas:
pct = areas[cmd]
print("Scanning {}% of frame".format(pct))
scanner.changeReadingArea(pct)
else:
print("Command not recognized")
def menu_reading_mode():
flush_stdin()
print()
print("-------------------------------------")
print("1) Manual Read Mode (Default)")
print("2) Continuous Read Mode")
print("3) Motion Sensor Mode")
print("-------------------------------------")
print("Select an option number:")
cmd = wait_for_key()
if cmd == "1":
print("Manual Trigger Mode enabled")
scanner.disableMotionSense()
elif cmd == "2":
print("Continuous Read Mode enabled")
scanner.enableContinuousRead()
elif cmd == "3":
print("Motion Trigger Mode enabled")
scanner.enableMotionSense()
else:
print("Command not recognized")
def menu_symbologies():
flush_stdin()
print()
print("-------------------------------------")
print("1) Enable All 1D Symbologies")
print("2) Disable All 1D Symbologies")
print("3) Enable All 2D Symbologies")
print("4) Disable All 2D Symbologies")
print("-------------------------------------")
print("Select an option number:")
cmd = wait_for_key()
if cmd == "1":
print("1D Symbologies enabled")
scanner.enableAll1D()
elif cmd == "2":
print("1D Symbologies disabled")
scanner.disableAll1D()
elif cmd == "3":
print("2D Symbologies enabled")
scanner.enableAll2D()
elif cmd == "4":
print("2D Symbologies disabled")
scanner.disableAll2D()
else:
print("Command not recognized")
while True:
flush_stdin()
print()
print("DE2120 Barcode Scanner")
print("-------------------------------------")
print("1) Start Scan")
print("2) Stop Scan")
print("3) Enable/Disable Flashlight")
print("4) Enable/Disable Aiming Reticle")
print("5) Set Reading Area")
print("6) Set Reading Mode")
print("7) Enable/Disable Symbologies")
print("-------------------------------------")
print("Select an option number:")
cmd = wait_for_key()
if cmd == "1":
scanner.startScan()
elif cmd == "2":
scanner.stopScan()
elif cmd == "3":
menu_flashlight()
elif cmd == "4":
menu_reticle()
elif cmd == "5":
menu_reading_area()
elif cmd == "6":
menu_reading_mode()
elif cmd == "7":
menu_symbologies()
else:
print("Command not recognized")
🔗Vollständiges Beispiel öffnen
Examples/de2120-serialSettings.py im Commit 848e03e
Erwartetes Ergebnis:
Scanner online!
DE2120 Barcode Scanner
-------------------------------------
1) Start Scan
2) Stop Scan
3) Enable/Disable Flashlight
4) Enable/Disable Aiming Reticle
5) Set Reading Area
6) Set Reading Mode
7) Enable/Disable Symbologies
-------------------------------------
Select an option number:
Geben Sie eine Zahl ein, um eine Option zu wählen. Die Optionen 3 bis 7 öffnen ein zweites Menü und geben nach der Auswahl eine Bestätigung aus, etwa White scan light on, Scanning 60% of frame oder Continuous Read Mode enabled; die Optionen 1 und 2 wirken sofort und ohne Meldung. Danach erscheint wieder das Hauptmenü. Ein Code, der gescannt wird, während ein Menü wartet, wird als ... gefolgt von Code found: und dem Inhalt des Codes ausgegeben.
Verwendete Funktionen
DE2120(uart=None, tx=None, rx=None, uart_id=1)returns DE2120Erstellt das Scanner-Objekt. Übergeben Sie eine selbst erstellte UART als uart oder die Pin-Nummern tx und rx; dann erstellt das Modul UART(uart_id) mit 9600 Baud auf diesen Pins. Ohne beides wird ValueError ausgelöst.
ReturnsDas Scanner-Objekt.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
UART | uart | Ein fertiges machine.UART-Objekt. Optional. |
int | tx | Der sendende Pin des Controllers, verbunden mit RX des Scanners. Das Beispiel verwendet 5. |
int | rx | Der empfangende Pin des Controllers, verbunden mit TX des Scanners. Das Beispiel verwendet 4. |
int | uart_id | Welche UART erstellt wird, wenn Sie tx und rx übergeben. Standardmäßig 1. |
scanner.begin()returns boolPrüft, ob der Scanner antwortet. Die Funktion stellt die UART auf 9600 Baud ein und fragt die Firmware-Version ab. Bleibt die Antwort aus, versucht sie es erneut mit 115200 Baud, weist den Scanner an, auf 9600 Baud umzuschalten, und fragt noch einmal. Bei Erfolg leert sie den Empfangspuffer.
ReturnsTrue, wenn der Scanner geantwortet hat, False, wenn nicht.
scanner.readBarcode()returns str or NoneSammelt die vom Scanner wartenden Bytes. Ein Scan endet mit einem Wagenrücklauf (Carriage Return); sobald einer eintrifft, gibt die Funktion den Code ohne ihn zurück. Ein einzelner Code umfasst höchstens 256 Bytes.
ReturnsDer gescannte Code oder None, wenn noch kein vollständiger Scan eingetroffen ist.
scanner.startScan()returns boolSendet den Befehl SCAN, der im manuellen Modus (Trigger-Modus) einen einzelnen Scan startet.
ReturnsTrue, wenn der Scanner den Befehl bestätigt hat.
scanner.stopScan()returns boolSendet den Befehl SLEEP, der einen laufenden Scan beendet.
ReturnsTrue, wenn der Scanner den Befehl bestätigt hat.
scanner.lightOn()returns boolSchaltet die weißen Beleuchtungs-LEDs ein (LAMENA1). Standardmäßig sind sie eingeschaltet.
ReturnsTrue, wenn der Scanner den Befehl bestätigt hat.
scanner.lightOff()returns boolSchaltet die weißen Beleuchtungs-LEDs aus (LAMENA0).
ReturnsTrue, wenn der Scanner den Befehl bestätigt hat.
scanner.reticleOn()returns boolSchaltet das rote Zielllicht ein (AIMENA1). Standardmäßig ist es eingeschaltet.
ReturnsTrue, wenn der Scanner den Befehl bestätigt hat.
scanner.reticleOff()returns boolSchaltet das rote Zielllicht aus (AIMENA0).
ReturnsTrue, wenn der Scanner den Befehl bestätigt hat.
scanner.changeReadingArea(percent)returns boolLegt fest, welcher Anteil des Kamerabilds, von dessen Mitte aus gemessen, vom Scanner nach einem Code durchsucht wird (IMGREG0 bis IMGREG4). Standard ist das gesamte Bild.
ReturnsTrue, wenn der Scanner den Befehl bestätigt hat; False bei einem Wert, den die Funktion nicht akzeptiert.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
int | percent | 100 (volle Breite), 80, 60, 40 oder 20. |
scanner.disableMotionSense()returns boolVersetzt den Scanner in den manuellen Modus (Trigger-Modus), den Standard (SCMMAN). Das Beispiel verwendet sie für die Option Manual Read Mode.
ReturnsTrue, wenn der Scanner den Befehl bestätigt hat.
scanner.enableContinuousRead(repeat_interval=2)returns boolVersetzt den Scanner in den kontinuierlichen Modus (SCMCNT), in dem er ohne Trigger liest, und legt fest, wie oft derselbe Code erneut gesendet wird (CNTALW).
ReturnsTrue, wenn der Scanner die Intervalleinstellung bestätigt hat; False bei einem Wert außerhalb von 0 bis 3.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
int | repeat_interval | Für denselben Code: 0 einmalige Ausgabe, 1 keine Verzögerung, 2 alle 0,5 s, 3 alle 1 s. Standardmäßig 2, was das Beispiel beibehält. |
scanner.enableMotionSense(sensitivity=50)returns boolVersetzt den Scanner in den Motion-Sense-Modus (SCMMDH) und legt seine Bewegungsempfindlichkeit fest (MDTTHR).
ReturnsTrue, wenn der Scanner die Empfindlichkeitseinstellung bestätigt hat; False bei einem Wert, den die Funktion nicht akzeptiert.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
int | sensitivity | 15 (höchste), 20, 30, 50 oder 100 (niedrigste). Standardmäßig 50, was das Beispiel beibehält. |
scanner.enableAll1D()returns boolSchaltet die Dekodierung aller 1D-Symbologien ein (ODCENA).
ReturnsTrue, wenn der Scanner den Befehl bestätigt hat.
scanner.disableAll1D()returns boolSchaltet die Dekodierung aller 1D-Symbologien aus (ODCDIS).
ReturnsTrue, wenn der Scanner den Befehl bestätigt hat.
scanner.enableAll2D()returns boolSchaltet die Dekodierung aller 2D-Symbologien ein (AQRENA).
ReturnsTrue, wenn der Scanner den Befehl bestätigt hat.
scanner.disableAll2D()returns boolSchaltet die Dekodierung aller 2D-Symbologien aus (AQRDIS).
ReturnsTrue, wenn der Scanner den Befehl bestätigt hat.
Zusammenfügen
wait_for_key() ist das Herzstück des Beispiels: Die Funktion ruft readBarcode() so lange auf, bis eine Taste gedrückt wird, sodass das Scannen nie stoppt, solange ein Menü geöffnet ist. Jeder Menüeintrag ist dann einer Funktion zugeordnet, und jede Funktion sendet ein oder zwei Konfigurationsbefehle an den Scanner und wartet auf deren Bestätigung. Das Beispiel ignoriert die Rückgabewerte; prüfen Sie sie in Ihrem eigenen Code, um zu sehen, ob der Scanner eine Einstellung akzeptiert hat.
Im kontinuierlichen Modus liest der Scanner ohne Trigger. Um stattdessen auf Abruf zu lesen, bleiben Sie im manuellen Modus und rufen startScan() in Ihrem Code auf, oder ziehen Sie TRIG auf Low.