Zum Hauptinhalt springen

Konfigurationsbefehl senden

Was dieses Beispiel zeigt​

Jede Einstellung des Scanners lässt sich mit sendCommand() aus Ihrem Sketch ändern, auch eine, für die die Bibliothek keine eigene Funktion hat. Dieses Beispiel schaltet die Code ID ein und aus. Ist die Code ID eingeschaltet, stellt der Scanner jedem gesendeten Code eine Symbologie-Kennung voran (zum Beispiel A für Code 128 und Q für QR Code), sodass Ihr Programm die Barcode-Typen unterscheiden kann.

Geben Sie y oder n im Serial Monitor ein, um sie umzuschalten. Der Sketch gibt weiterhin gescannte Codes aus, während er auf Ihre Antwort wartet.

Das Beispiel verwendet Pin 4 als RX des Controllers (mit TX des Scanners verbinden) und Pin 5 als dessen TX (mit RX des Scanners verbinden); ändern Sie die beiden Zahlen passend zu Ihrer Verdrahtung. Verwenden Sie einen 3,3-V-Controller und schalten Sie den Scanner zuvor auf UART um, indem Sie den Konfigurations-Barcode POR232 scannen.

Dieses Beispiel verwendet außerdem SoftwareSerial, das nicht zur Soldered-DE2120-Bibliothek gehört. Laut dem Kommentar im Beispiel finden Sie es im Arduino Library Manager.

Der Beispielcode​

Select Board
SendCommand.ino
/**
**************************************************
*
* @file SendCommand.ino
* @brief Toggle Code ID prefix transmission on the DE2120
* 1D/2D barcode scanner module over SoftwareSerial.
*
* When Code ID is enabled, the scanner prepends a
* symbology identifier character to every scanned barcode
* (e.g. 'A' for Code 128, 'Q' for QR Code). This can help
* the host application distinguish barcode types at runtime.
*
* The sketch presents a Serial Monitor prompt and also
* continuously polls for barcodes while waiting for input.
* Sending 'y' enables Code ID via the CIDENA command;
* sending 'n' disables it.
*
* 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("Transmit Code ID with Barcode? (y/n)");
Serial.println("-------------------------------------");
Serial.println("Type 'y' or 'n' or scan a barcode: ");

// 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 'y':
Serial.println("Code ID will be displayed on scan");
scanner.sendCommand("CIDENA", "1");
break;

case 'n':
Serial.println("Code ID will NOT be displayed on scan");
scanner.sendCommand("CIDENA", "0");
break;

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

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!

Transmit Code ID with Barcode? (y/n)
-------------------------------------
Type 'y' or 'n' or scan a barcode:

Senden Sie y, und der Sketch gibt Code ID will be displayed on scan aus; senden Sie n, gibt er Code ID will NOT be displayed on scan aus. Jedes andere Zeichen führt zur Ausgabe Command not recognized. Danach erscheint die Eingabeaufforderung erneut. Ein Code, der gescannt wird, während die Eingabeaufforderung wartet, wird als ... gefolgt von Code found: und dem Inhalt des Codes ausgegeben, wobei die Kennung vor dem Code steht, sobald Code ID eingeschaltet ist.

Verwendete Funktionen​

SoftwareSerial(rxPin, txPin, inverse_logic)returns None

Konstruktor aus der SoftwareSerial-Bibliothek. Erzeugt einen seriellen Port auf zwei digitalen Pins, der in Software ausgeführt wird. Nur ein SoftwareSerial-Port kann zur gleichen Zeit empfangen.

ReturnsKonstruktor; kein Rückgabewert.

Parameter

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

Erzeugt das Scanner-Objekt. Es enthält noch keine Pins oder 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, versucht es es erneut mit 115200 Baud, weist den Scanner an, auf 9600 Baud umzuschalten, und fragt erneut. Bei Erfolg leert es 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 fertigen Scan enthält, wird vor dem nächsten gelöscht.

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.sendCommand(const char *cmd, const char *arg, uint32_t maxWaitInms)returns bool

Sendet einen Konfigurationsbefehl an den Scanner, im erwarteten Format: ^_^, der Befehl, das Argument und ein abschließender Punkt (hier ^_^CIDENA1.). Anschließend wartet es auf die Antwort des Scanners: ein ACK-Byte (0x06) oder ein NACK-Byte (0x15). Befehl und Argument zusammen passen in 9 Zeichen.

Returnstrue bei ACK; false bei NACK oder wenn maxWaitInms ohne Antwort verstreicht.

Parameter

TypNameBeschreibung
const char *cmdDer Befehl oder Eigenschaftsname, zum Beispiel CIDENA (Code ID übertragen).
const char *argDer Wert, zum Beispiel 1 zum Einschalten oder 0 zum Ausschalten. Standardmäßig leer.
uint32_tmaxWaitInmsWie lange auf eine Antwort gewartet wird, in Millisekunden. Standardmäßig 3000.

Zusammenspiel​

loop() löscht zuerst alles, was noch in der Eingabe des Serial Monitors steht, etwa das Zeilenende nach Ihrer letzten Antwort, und gibt dann die Eingabeaufforderung aus. Solange keine Taste gedrückt wird, fragt es alle 200 ms readBarcode() ab, sodass Scans weiterhin erscheinen. Aus einem y oder n wird sendCommand("CIDENA", "1") beziehungsweise sendCommand("CIDENA", "0").

Nach demselben Muster lässt sich jede andere Einstellung senden. Die Bibliothek benennt die ihr bekannten in SparkFun_DE2120_Arduino_Library.h, zum Beispiel BEPSUC (Signalton bei erfolgreicher Dekodierung, standardmäßig 1) oder IMGREG (Lesebereich).