Zum Hauptinhalt springen

Barcodes über einen Hardware-UART lesen

Was dieses Beispiel zeigt​

Ein ESP32 kommuniziert über seinen Hardware-UART2 mit dem Scanner und gibt jeden vom Scanner gelesenen Code im Serial Monitor aus. Ein Hardware-UART ist eine dedizierte serielle Peripherie, die der Kommentar im Beispiel selbst als zuverlässiger als SoftwareSerial bezeichnet.

Verdrahten Sie ihn, wie es der Kommentar im Beispiel angibt: GPIO4 ist der RX des ESP32 (zum TX des Scanners) und GPIO5 sein TX (zum RX des Scanners), dazu 3V3 und GND. Schalten Sie den Scanner zuerst auf UART um, indem Sie den Konfigurationsbarcode POR232 scannen.

Dieses Beispiel verwendet außerdem HardwareSerial, das im ESP32-Board-Package enthalten ist.

Der Beispielcode​

Select Board
HardwareScan.ino
/**
**************************************************
*
* @file HardwareScan.ino
* @brief Scan and output barcodes using the DE2120 1D/2D barcode
* scanner module over HardwareSerial (UART2) on ESP32.
*
* Unlike SoftwareSerial, HardwareSerial uses a dedicated
* UART peripheral for reliable communication at 115200 bps.
* The library will automatically negotiate the baud rate
* down to 9600 bps on first connect.
*
* Default wiring: GPIO4 = RX (scanner TX),
* GPIO5 = TX (scanner RX). Change the pin arguments in
* scannerSerial.begin() to match your wiring.
*
* The scanner must first be put into TTL/RS232 mode by
* scanning the POR232 barcode from the DYScan settings
* manual before uploading this sketch.
*
* Make sure you have SoftwareSerial library installed. It
* can be found in Arduino library manager.
*
* @authors Fran Fodor @ soldered.com
***************************************************/

#include "HardwareSerial.h"
HardwareSerial scannerSerial(2); // Use UART2

#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");

scannerSerial.begin(115200, SERIAL_8N1, 4, 5); // RX=GPIO4, TX=GPIO5
delay(500);

if (scanner.begin(scannerSerial) == 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()
{
if (scanner.readBarcode(scanBuffer, BUFFER_LEN))
{
Serial.print("Code found: ");
for (int i = 0; i < strlen(scanBuffer); i++)
Serial.print(scanBuffer[i]);
Serial.println();
}
delay(200);
}

Erwartetes Ergebnis:

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

Drücken Sie anschließend die Auslösetaste am Board und richten Sie den Scanner auf einen Code. Jeder vom Scanner gelesene Code wird in einer eigenen Zeile als Code found: gefolgt vom Inhalt des Codes ausgegeben. Antwortet der Scanner nicht, gibt die Skizze Scanner did not respond. Please check wiring. Did you scan the POR232 barcode? Freezing... aus und hält an.

Verwendete Funktionen​

HardwareSerial(uint8_t uart_nr)returns None

Konstruktor aus dem ESP32-Board-Package. Erzeugt einen seriellen Port an einem der Hardware-UARTs des ESP32. Das Beispiel verwendet UART2.

ReturnsKonstruktor; kein Rückgabewert.

Parameter

TypNameBeschreibung
uint8_tuart_nrDie Nummer des Hardware-UART. Das Beispiel übergibt 2.
scannerSerial.begin(unsigned long baud, uint32_t config = SERIAL_8N1, int8_t rxPin = -1, int8_t txPin = -1, ...)returns void

Aus dem ESP32-Board-Package. Startet den Hardware-UART mit einer Baudrate und einem Frame-Format an den angegebenen RX- und TX-Pins. Die Scanner-Bibliothek ändert die Baudrate danach selbst, der Wert 115200 ist hier also nur ein Startwert.

ReturnsNichts.

Parameter

TypNameBeschreibung
unsigned longbaudBaudrate. Das Beispiel übergibt 115200.
uint32_tconfigDatenbits, Parität und Stoppbits. SERIAL_8N1 ist der Standardwert.
int8_trxPinDer empfangende Pin des ESP32, verbunden mit dem TX des Scanners. Das Beispiel verwendet 4.
int8_ttxPinDer sendende Pin des ESP32, verbunden mit dem RX des Scanners. Das Beispiel verwendet 5.
DE2120_Soldered()returns None

Erzeugt das Scanner-Objekt. Es enthält noch keine Pins oder Ports: begin() verbindet es mit einem seriellen Port.

ReturnsKonstruktor; kein Rückgabewert.

scanner.begin(HardwareSerial &serialPort)returns bool

Verbindet das Scanner-Objekt mit einem seriellen Hardware-Port und prüft, ob der Scanner antwortet. Es stellt den Port auf 9600 Baud ein und fragt die Firmware-Version ab. Bleibt die Antwort aus, wiederholt es den Versuch 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
HardwareSerial &serialPortDer Port, an den der Scanner angeschlossen ist, hier scannerSerial.
scanner.readBarcode(char *resultBuffer, uint8_t size)returns bool

Liest die vom Scanner wartenden Bytes in resultBuffer. Ein Scan endet mit einem Wagenrücklauf (Carriage Return); sobald einer eintrifft, gibt die Funktion true zurück, und der Puffer enthält den Code, den Wagenrücklauf und eine abschließende Null. Ein Puffer, der bereits einen fertigen Scan enthält, wird vor dem nächsten geleert. Rufen Sie sie wiederholt aus loop() auf.

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.

Alles zusammen​

scannerSerial.begin() richtet UART2 an den verdrahteten Pins ein, und scanner.begin() nutzt diesen Port, um den Scanner zu finden und auf 9600 Baud zu bringen. Von da an fragt loop() alle 200 ms readBarcode() ab. Gibt die Funktion true zurück, gibt die Skizze den Puffer nach Code found: Zeichen für Zeichen aus.

Der Scanner startet im manuellen Modus, er liest also, solange die Auslösetaste gedrückt ist oder TRIG auf Low gehalten wird. Wie Sie ohne die Taste lesen, finden Sie unter Scanner-Einstellungen über den Serial Monitor ändern.