Zum Hauptinhalt springen

Scanner-Einstellungen über den Serial Monitor ändern

Was dieses Beispiel zeigt​

Ein Menü im Serial Monitor steuert den Scanner im laufenden Betrieb: Scan starten und stoppen, die weiße Beleuchtung und das rote Zielllicht ein- und ausschalten, festlegen, welcher Teil des Kamerabilds nach einem Code durchsucht wird, manuelles Lesen, kontinuierliches Lesen oder Lesen per Bewegungserkennung wählen sowie die Gruppen der 1D- und 2D-Symbologien ein- und ausschalten. Codes, die Sie scannen, während ein Menü wartet, werden weiterhin ausgegeben.

Das Beispiel verwendet Pin 4 als RX des Controllers (mit dem TX des Scanners verbinden) und Pin 5 als dessen TX (mit dem RX des Scanners verbinden); passen Sie die beiden Zahlen an Ihre Verdrahtung an. Verwenden Sie einen 3,3-V-Controller und schalten Sie den Scanner zuerst auf UART um, indem Sie den Konfigurationsbarcode POR232 scannen.

Dieses Beispiel verwendet außerdem SoftwareSerial, das nicht Teil der Soldered-DE2120-Bibliothek ist. Laut dem Kommentar im Beispiel finden Sie sie im Arduino Library Manager.

Der Beispielcode​

Select Board
SerialSettings.ino
/**
**************************************************
*
* @file SerialSettings.ino
* @brief Interactive configuration and scanning demo for the DE2120
* 1D/2D barcode scanner module over SoftwareSerial.
*
* Presents a Serial Monitor menu to control scanner settings
* at runtime: start/stop scanning, toggle the illumination
* flashlight and aiming reticle, adjust the reading area,
* switch reading modes (manual, continuous, motion), and
* enable or disable 1D/2D symbology groups.
*
* While the menu is displayed the sketch continuously polls
* for barcodes, printing any result to Serial Monitor before
* waiting for the next menu selection.
*
* The scanner must first be put into TTL/RS232 mode by
* scanning the POR232 barcode from the DYScan settings
* manual. Change the SoftwareSerial pin arguments to match
* your wiring before uploading.
*
* Make sure you have SoftwareSerial library installed. It
* can be found in Arduino library manager.
*
* @authors Fran Fodor @ soldered.com
***************************************************/

#include "SoftwareSerial.h"
SoftwareSerial softSerial(4, 5); // change according to your wiring

#include "DE2120-SOLDERED.h"
DE2120_Soldered scanner;

#define BUFFER_LEN 40
char scanBuffer[BUFFER_LEN];

void setup()
{
Serial.begin(115200);
Serial.println("DE2120 Scanner Example");

if (scanner.begin(softSerial) == false)
{
Serial.println("Scanner did not respond. Please check wiring. Did you scan the POR232 barcode? Freezing...");
while (1)
;
}
Serial.println("Scanner online!");
}

void loop()
{
flushRx(); // Clear the serial rx buffer to avoid line endings

Serial.println();
Serial.println("SparkFun DE2120 Barcode Scanner Library");
Serial.println("-------------------------------------");
Serial.println("1) Start Scan");
Serial.println("2) Stop Scan");
Serial.println("3) Enable/Disable Flashlight");
Serial.println("4) Enable/Disable Aiming Reticle");
Serial.println("5) Set Reading Area");
Serial.println("6) Set Reading Mode");
Serial.println("7) Enable Disable Symbologies");
Serial.println("-------------------------------------");
Serial.println("Select an option number: ");

// Wait for the user to reply but look for barcodes in the meantime
while (Serial.available() == false)
{
if (scanner.readBarcode(scanBuffer, BUFFER_LEN))
{
Serial.println("...");
Serial.print("Code found: ");
for (int i = 0; i < strlen(scanBuffer); i++)
Serial.print(scanBuffer[i]);
Serial.println();
}

delay(200);
}

switch (Serial.read())
{

case '1':
scanner.startScan();
break;

case '2':
scanner.stopScan();
break;

case '3':
flashlight();
break;

case '4':
reticle();
break;

case '5':
readingArea();
break;

case '6':
readingMode();
break;

case '7':
symbologies();
break;

default:
Serial.println("Command not recognized");
break;
}
}

void flashlight()
{
flushRx(); // Clear the serial rx buffer to avoid line endings

Serial.println();
Serial.println("-------------------------------------");
Serial.println("1) Enable Flashlight");
Serial.println("2) Disable Flashlight");
Serial.println("-------------------------------------");
Serial.println("Select an option number:");

while (Serial.available() == false)
{
//Wait for user to send char
}

switch (Serial.read())
{
case '1':
Serial.println("White scan light on");
scanner.lightOn();
break;

case '2':
Serial.println("White scan light off");
scanner.lightOff();
break;

default:
Serial.println("Command not recognized");
break;
}
}

void reticle()
{
flushRx(); // Clear the serial rx buffer to avoid line endings

Serial.println();
Serial.println("-------------------------------------");
Serial.println("1) Enable Reticle");
Serial.println("2) Disable Reticle");
Serial.println("-------------------------------------");
Serial.println("Select an option number:");

while (Serial.available() == false)
{
//Wait for user to send char
}

switch (Serial.read())
{
case '1':
Serial.println("Red scan reticle on");
scanner.reticleOn();
break;

case '2':
Serial.println("Red scan reticle off");
scanner.reticleOff();
break;

default:
Serial.println("Command not recognized");
break;
}

}

void readingArea()
{
flushRx(); // Clear the serial rx buffer to avoid line endings

Serial.println("...");
Serial.println("...");
Serial.println("...");
Serial.println("-------------------------------------");
Serial.println("1) Full Width (Default)");
Serial.println("2) Center 80%");
Serial.println("3) Center 60%");
Serial.println("4) Center 40%");
Serial.println("5) Center 20%");
Serial.println("-------------------------------------");
Serial.println("Select an option number:");

while (Serial.available() == false)
{
//Wait for user to send char
}

switch(Serial.read()){

case '1':
Serial.println("Scanning 100% of frame");
scanner.changeReadingArea(100);
return;

case '2':
Serial.println("Scanning center 80% of frame");
scanner.changeReadingArea(80);
return;

case '3':
Serial.println("Scanning center 60% of frame");
scanner.changeReadingArea(60);
return;

case '4':
Serial.println("Scanning center 40% of frame");
scanner.changeReadingArea(40);
return;

case '5':
Serial.println("Scanning center 20% of frame");
scanner.changeReadingArea(20);
return;

default:
Serial.println("Command not recognized");
return;
}
}

void readingMode()
{
flushRx(); // Clear the serial rx buffer to avoid line endings

Serial.println("...");
Serial.println("...");
Serial.println("...");
Serial.println("-------------------------------------");
Serial.println("1) Manual Read Mode (Default)");
Serial.println("2) Continuous Read Mode");
Serial.println("3) Motion Sensor Mode");
Serial.println("-------------------------------------");
Serial.println("Select an option number:");

while (Serial.available() == false)
{
//Wait for user to send char
}

switch(Serial.read()){

case '1':
Serial.println("Manual Trigger Mode enabled");
scanner.disableMotionSense();
return;

case '2':
Serial.println("Continuous Read Mode enabled");
scanner.enableContinuousRead();
return;

case '3':
Serial.println("Motion Trigger Mode enabled");
scanner.enableMotionSense();
return;

default:
Serial.println("Command not recognized");
return;
}
}

void symbologies()
{
flushRx(); // Clear the serial rx buffer to avoid line endings

Serial.println("...");
Serial.println("...");
Serial.println("...");
Serial.println("-------------------------------------");
Serial.println("1) Enable All 1D Symbologies");
Serial.println("2) Disable All 1D Symbologies");
Serial.println("3) Enable All 2D Symbologies");
Serial.println("4) Disable All 2D Symbologies");
Serial.println("-------------------------------------");
Serial.println("Select an option number:");

while (Serial.available() == false)
{
//Wait for user to send char
}

switch(Serial.read()){

case '1':
Serial.println("1D Symbologies enabled");
scanner.enableAll1D();
return;

case '2':
Serial.println("1D Symbologies disabled");
scanner.disableAll1D();
return;

case '3':
Serial.println("2D Symbologies enabled");
scanner.enableAll2D();
return;

case '4':
Serial.println("2D Symbologies disabled");
scanner.disableAll2D();
return;

default:
Serial.println("Command not recognized");
return;
}
}

void flushRx(){
while(Serial.available()){
Serial.read();
delay(1);
}
}

Erwartetes Ergebnis:

Serial MonitorAutoscrollShow timestampNewline115200 baud
Message (Enter to send message to the board)
DE2120 Scanner Example
Scanner online!

SparkFun DE2120 Barcode Scanner Library
-------------------------------------
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:

Senden Sie eine Zahl, 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 center 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 das Hauptmenü wartet, wird als ... gefolgt von Code found: und dem Inhalt des Codes ausgegeben.

Option 6, dann 3 (Motion Sensor Mode) sendet einen POR-Befehl. Sie ruft enableMotionSense() mit dem Standardwert 50 auf, was POR50 sendet, einen Befehl aus der Familie der Kommunikationsmodi des Scanners. Was POR50 auf dem Scanner bewirkt, ist nicht dokumentiert, und die Bibliothek warnt, dass ein USB-Modus dazu führt, dass der Scanner nicht mehr über TTL antwortet. Siehe die Warnung unter enableMotionSense() weiter unten.

Verwendete Funktionen​

SoftwareSerial(rxPin, txPin, inverse_logic)returns None

Konstruktor aus der SoftwareSerial-Bibliothek. Erstellt einen in Software realisierten seriellen Port auf zwei digitalen Pins. Es kann immer nur ein SoftwareSerial-Port gleichzeitig empfangen.

ReturnsKonstruktor; kein Rückgabewert.

Parameter

TypNameBeschreibung
Pin-NummerrxPinDer empfangende Pin, verbunden mit dem TX des Scanners. Das Beispiel verwendet 4.
Pin-NummertxPinDer sendende Pin, verbunden mit dem RX des Scanners. Das Beispiel verwendet 5.
boolinverse_logicInvertiert den Signalsinn. Optional, standardmäßig false; das Beispiel lässt ihn weg.
DE2120_Soldered()returns None

Erstellt das Scanner-Objekt. Es enthält noch keine Pins und keinen Port: begin() verbindet es mit einem seriellen Port.

ReturnsKonstruktor; kein Rückgabewert.

scanner.begin(SoftwareSerial &serialPort)returns bool

Verbindet das Scanner-Objekt mit einem SoftwareSerial-Port und prüft, ob der Scanner antwortet. Es startet den Port mit 9600 Baud und fragt die Firmware-Version ab. Bleibt die Antwort aus, wird es mit 115200 Baud erneut versucht, der Scanner angewiesen, auf 9600 Baud umzuschalten, und erneut gefragt. Bei Erfolg leert die Funktion den Empfangspuffer, damit der erste Scan sauber gelesen wird.

Returnstrue, wenn der Scanner geantwortet hat, false, wenn nicht.

Parameter

TypNameBeschreibung
SoftwareSerial &serialPortDer Port, an den der Scanner angeschlossen ist, hier softSerial.
scanner.readBarcode(char *resultBuffer, uint8_t size)returns bool

Liest die vom Scanner wartenden Bytes in resultBuffer. Ein Scan endet mit einem Carriage Return; sobald einer eintrifft, gibt die Funktion true zurück und der Puffer enthält den Code, das Carriage Return und eine abschließende Null. Ein Puffer, der bereits einen abgeschlossenen Scan enthält, wird vor dem nächsten geleert.

Returnstrue, wenn ein vollständiger Scan im Puffer liegt, false, wenn noch kein vollständiger Scan eingetroffen ist.

Parameter

TypNameBeschreibung
char *resultBufferPuffer, der den Code sammelt. Das Beispiel verwendet 40 Bytes.
uint8_tsizeGröße des Puffers. Es werden höchstens so viele Bytes gelesen, ein längerer Code wird daher abgeschnitten.
scanner.startScan()returns bool

Sendet den Befehl SCAN, der einen Scan startet. Gedacht für den manuellen Modus (Trigger), der der Standard ist.

Returnstrue, wenn der Scanner den Befehl bestätigt hat.

scanner.stopScan()returns bool

Sendet den Befehl SLEEP, der einen laufenden Scan beendet.

Returnstrue, wenn der Scanner den Befehl bestätigt hat.

scanner.lightOn()returns bool

Schaltet die weißen Beleuchtungs-LEDs ein (LAMENA1). Sie sind standardmäßig eingeschaltet.

Returnstrue, wenn der Scanner den Befehl bestätigt hat.

scanner.lightOff()returns bool

Schaltet die weißen Beleuchtungs-LEDs aus (LAMENA0).

Returnstrue, wenn der Scanner den Befehl bestätigt hat.

scanner.reticleOn()returns bool

Schaltet das rote Zielllicht ein (AIMENA1). Es ist standardmäßig eingeschaltet.

Returnstrue, wenn der Scanner den Befehl bestätigt hat.

scanner.reticleOff()returns bool

Schaltet das rote Zielllicht aus (AIMENA0).

Returnstrue, wenn der Scanner den Befehl bestätigt hat.

scanner.changeReadingArea(uint8_t percent)returns bool

Legt fest, welcher Teil 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

TypNameBeschreibung
uint8_tpercent100 (volle Breite), 80, 60, 40 oder 20.
scanner.disableMotionSense()returns bool

Versetzt den Scanner in den manuellen Modus (Trigger), 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(uint8_t repeatInterval = 2)returns bool

Versetzt 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 Intervall von 4 oder mehr.

Parameter

TypNameBeschreibung
uint8_trepeatIntervalFür denselben Code: 0 einmal ausgeben, 1 ohne Intervall wiederholen, 2 alle 0,5 s, 3 jede 1 s. Das Beispiel belässt es bei 2.
scanner.enableMotionSense(uint8_t sensitivity = 50)returns bool

Versetzt den Scanner in den Bewegungserkennungsmodus (SCMMDH) und sendet dann die Empfindlichkeit. In dieser Version der Bibliothek wird die Empfindlichkeit nach dem Präfix POR statt nach MDTTHR gesendet, der Einstellung des Scanners für die Bewegungsempfindlichkeit. Der Rückgabewert spiegelt daher diesen zweiten Befehl wider und keine Änderung der Empfindlichkeit.

ReturnsDie Antwort des Scanners auf den Empfindlichkeitsbefehl; false bei einem Wert, den die Funktion nicht akzeptiert.

Parameter

TypNameBeschreibung
uint8_tsensitivity15 (höchste), 20, 30, 50 oder 100 (niedrigste). Das Beispiel belässt es bei 50.

Die Empfindlichkeit hat in dieser Version der Bibliothek keine Wirkung. Die Funktion sendet den Wert hinter POR, dem Präfix der Kommunikationsmodus-Befehle des Scanners (POR232 ist der TTL/RS232-Modus, PORKBD, PORHID und PORVIC sind USB-Modi), nicht hinter MDTTHR. Die Übergabe von 15 oder 100 ändert daher nicht die Bewegungsempfindlichkeit. Was der resultierende Befehl POR15, POR20, POR30, POR50 oder POR100 auf dem Scanner bewirkt, ist nicht dokumentiert: Keiner davon gehört zu den Kommunikationsmodi, die die Bibliothek auflistet. Die Bibliothek selbst warnt, dass ein USB-Modus dazu führt, dass der Scanner nicht mehr über TTL antwortet. Um die Empfindlichkeit einzustellen, senden Sie sie selbst mit scanner.sendCommand("MDTTHR", "15") (oder 20, 30, 50, 100).

scanner.enableAll1D()returns bool

Schaltet die Dekodierung aller 1D-Symbologien ein (ODCENA).

Returnstrue, wenn der Scanner den Befehl bestätigt hat.

scanner.disableAll1D()returns bool

Schaltet die Dekodierung aller 1D-Symbologien aus (ODCDIS).

Returnstrue, wenn der Scanner den Befehl bestätigt hat.

scanner.enableAll2D()returns bool

Schaltet die Dekodierung aller 2D-Symbologien ein (AQRENA).

Returnstrue, wenn der Scanner den Befehl bestätigt hat.

scanner.disableAll2D()returns bool

Schaltet die Dekodierung aller 2D-Symbologien aus (AQRDIS).

Returnstrue, wenn der Scanner den Befehl bestätigt hat.

Zusammenfassung​

Jeder Menüeintrag entspricht einer Funktion, und jede Funktion sendet einen oder zwei der Konfigurationsbefehle des Scanners und wartet auf dessen Bestätigung. Die Skizze ignoriert die Rückgabewerte; prüfen Sie diese in Ihrem eigenen Code, um zu sehen, ob der Scanner eine Einstellung akzeptiert hat.

Im kontinuierlichen Modus liest der Scanner ohne Trigger, und repeatInterval legt fest, wie oft er denselben Code erneut sendet. Um stattdessen bei Bedarf zu lesen, bleiben Sie im manuellen Modus und rufen startScan() aus Ihrem Code auf, oder ziehen Sie TRIG auf Low.