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
/**
**************************************************
*
* @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:
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 NoneKonstruktor 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
| Typ | Name | Beschreibung |
|---|---|---|
| Pin-Nummer | rxPin | Der empfangende Pin, verbunden mit TX des Scanners. Das Beispiel verwendet 4. |
| Pin-Nummer | txPin | Der sendende Pin, verbunden mit RX des Scanners. Das Beispiel verwendet 5. |
bool | inverse_logic | Invertiert die Signallogik. Optional, standardmäßig false; das Beispiel lässt ihn weg. |
DE2120_Soldered()returns NoneErzeugt 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 boolVerbindet 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
| Typ | Name | Beschreibung |
|---|---|---|
SoftwareSerial & | serialPort | Der Port, an den der Scanner angeschlossen ist, hier softSerial. |
scanner.readBarcode(char *resultBuffer, uint8_t size)returns boolLiest 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
| Typ | Name | Beschreibung |
|---|---|---|
char * | resultBuffer | Puffer, der den Code sammelt. Das Beispiel verwendet 40 Byte. |
uint8_t | size | Größ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.