Ja, die letzte Variante finde ich schon gelungen....
Ein paar kleine Verbesserungen könnte man da aber auch noch unter bringen...
z.B. führt
Reader.begin(9600);
Target.begin(115200);
Debug.begin(115200);
Zu unerwünschten Seiteneffekten.
Stream ist allgemeiner und würde auch Dateien, Funke usw. als Ziel erlauben.
Zudem kann man auf das memcpy_P verzichten.
Aber das sind alles nur Details.
Keins davon ist Überlebenswichtig.
/*
Empfängt Daten an der Schnittstelle "Reader"
Wandelt diese gemäß translate um
Sendet die Daten an die Schnittstelle "Target"
Kombination von Beispiel 2 aus Serial Input Basics - updated
https://forum.arduino.cc/t/serial-input-basics-updated/382007
Warum: https://forum.arduino.cc/t/barcodescanner-mit-datenbank-furs-rusten/900857
PoC by noiasca
von 2748/942 (PoC)
auf 2648/736 bei Verwendung einer numerischer Variablen für den EAN
auf 2686/232 mit PROGMEM
*/
using FlashStr = const __FlashStringHelper *;
const byte textSize = 11 + 1; // max size + 1 for Null
struct Data
{
uint32_t ean;
char out[textSize];
};
const Data translate[] PROGMEM = {
{0, "not found"},
{70002893, "R0805_01"},
{70002873, "R0805_02"},
{70002368, "R0805_03"},
{70002763, "R0805_04"},
{70002615, "R0805_05"},
{70002559, "R0805_06"},
{70002172, "R0805_07"},
{70002948, "R0805_08"},
{70002933, "R0805_09"},
{70002658, "R0805_10"},
{70002702, "R1206_01"},
{70002475, "R1206_02"},
{70002822, "R1206_03"},
{70002280, "R1206_04"},
{70002319, "R1206_05"},
{70002633, "R1206_06"},
{70002046, "R1206_07"},
{70002114, "R1206_08"},
{70002462, "R1206_09"},
{70002319, "R1206_10"},
{70002902, "R1206_11"},
{70002906, "R1206_12"},
{70002738, "R1206_13"},
{70002689, "R1206_14"},
{70002180, "CDFP14_1"},
{70002450, "CDFP14_2"},
{70002442, "CDFP14_3"},
{70002019, "CDFP14_4"},
{70002822, "DO-213AA_01"},
{70002799, "DO-213AA_02"},
{70002135, "DO-213AA_03"},
{70002055, "DO-213AA_04"},
};
// just for a lokal debugging, "real" Serial
Stream &Debug = Serial;
// the barcode reader:
Stream &Reader = Serial; // am Mega z.B. Serial1
// the target which should receive the data
Stream &Target = Serial; // am Mega z.B. Serial2
const byte numChars = 16;
char receivedChars[numChars]; // an array to store the received data
boolean newData = false;
void setup() {
Serial.begin(9600);
// Target.begin(115200);
// Debug.begin(115200);
Debug.println(F("D Serial translator"));
// init the display...
}
void loop() {
recvWithEndMarker();
showNewData();
}
void recvWithEndMarker() {
static byte ndx = 0;
char endMarker = '\n'; // Annahme wir bekommen einen Zeilende
char rc;
while (Reader.available() > 0 && newData == false) {
rc = Reader.read();
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
receivedChars[ndx] = '\0'; // terminate the string
ndx = 0;
newData = true;
}
}
}
//
void showNewData() {
if (newData == true) {
newData = false;
Debug.print("D Received: "); Debug.println(receivedChars);
uint32_t ean = atol(receivedChars);
int index = getIndex(ean);
// Data resultData; // create a temporary buffer with one element
//memcpy_P (&resultData, &translate[index], sizeof(resultData)); // read http://www.gammon.com.au/progmem - ALL!!!
// Debug.print("D translate: "); Debug.println(resultData.out);
Debug.print("D translate: "); Debug.println(FlashStr(translate[index].out));
// updateDisplay(receivedChars, resultData.out);
updateDisplay(receivedChars,FlashStr(translate[index].out));
if (index > 0) // nur bei einem validen Ergebnis auch ans Target senden
{
// Target.print(resultData.out); Target.print("\n"); // achtgeben, was das target als Endezeichen braucht
Target.print(FlashStr(translate[index].out)); Target.print("\n"); // achtgeben, was das target als Endezeichen braucht
}
}
}
// suche die Position der needle im Array
size_t getIndex(uint32_t needle)
{
//Debug.print(F("D needle ")); Debug.println(needle);
size_t result = 0; // not found
for (size_t i = 0; i < sizeof(translate) / sizeof(translate[0]); i++)
{
uint32_t entry = (uint32_t)pgm_read_dword_near(&translate[i].ean);
//Debug.print(F("D entry ")); Debug.println(entry);
if (needle == entry)
{
Debug.print(F("D found on index ")); Debug.println(i);
return i;
}
}
return result;
}
//void updateDisplay(const char * ean, const char * out)
void updateDisplay(const char * ean, FlashStr out)
{
// could be an external display
// lcd.clear()
// lcd.setCursor(0,0);
// lcd.print("EAN: ");
// lcd.print("Out: ");
// lcd.setCursor(0,1);
// lcd.print(ean);
// lcd.print(out);
// if code is unused
(void)ean;
(void)out;
}