Zum Hauptinhalt springen

Barcodes über SoftwareSerial lesen

Was dieses Beispiel zeigt​

Der Controller liest jeden Code, den der Scanner sendet, und gibt ihn im Serial Monitor aus. Hier hängt der Scanner an zwei gewöhnlichen digitalen Pins, die per SoftwareSerial angesteuert werden.

Das Beispiel verwendet Pin 4 als RX des Controllers (mit TX des Scanners verbinden) und Pin 5 als TX des Controllers (mit RX des Scanners verbinden); ändern Sie die beiden Zahlen, damit sie zu Ihrer Verdrahtung passen. Das Board arbeitet mit 3,3-V-Logik, verwenden Sie also einen Controller mit 3,3 V. Schalten Sie den Scanner zuerst auf UART um, indem Sie den Konfigurations-Barcode POR232 scannen.

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

Der Beispielcode​

Select Board
SoftwareScan.ino
/**
**************************************************
*
* @file SoftwareScan.ino
* @brief Scan and output barcodes using the DE2120 1D/2D barcode
* scanner module over SoftwareSerial.
*
* The scanner must first be put into TTL/RS232 mode by
* scanning the POR232 barcode from the DYScan settings
* manual. The library will automatically negotiate the
* baud rate down from 115200 to 9600 bps on first connect.
* 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()
{
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 dann die Auslösetaste auf dem Board und richten Sie den Scanner auf einen Code. Jeder Code, den der Scanner liest, 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​

SoftwareSerial(rxPin, txPin, inverse_logic)returns None

Konstruktor aus der SoftwareSerial-Bibliothek. Erzeugt einen seriellen Port auf zwei digitalen Pins, der in Software betrieben wird. Es kann immer nur ein SoftwareSerial-Port gleichzeitig 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 Signallogik. Optional, standardmäßig false; das Beispiel lässt ihn 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. Die Funktion startet den Port mit 9600 Baud 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, damit der erste Scan sauber gelesen wird. Sie müssen softSerial.begin() nicht selbst aufrufen.

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 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 die Funktion 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 Byte.
uint8_tsizeGröße des Puffers. Es werden höchstens so viele Bytes gelesen, ein längerer Code wird also abgeschnitten.

Zusammenspiel​

scanner.begin() startet den SoftwareSerial-Port selbst, findet den Scanner und stellt ihn auf 9600 Baud ein. Von da an fragt loop() alle 200 ms readBarcode() ab. Gibt die Funktion true zurück, gibt die Skizze den Puffer Zeichen für Zeichen nach Code found: aus.

Der Scanner startet im manuellen Modus, er liest also, solange die Auslösetaste gedrückt oder TRIG auf Low gehalten wird. Wenn Ihr Board einen freien Hardware-UART hat, erledigt das Hardware-UART-Beispiel dieselbe Aufgabe darauf.