Hallo,
ich versuche einen Bar Code auszulesen mit einem Arduino Uno+USB Shield+LCD Display. Ich habe das SPI Protokol Programm kopiert. Das Uno Board lässt keine USB librarys zu, ansonsten hätte ich damit gearbeitet.
Das Problem ist, dass der angezeigte Bar code nur wenige Zahlen anzeigt und die meisten übersprungen werden. (immer die gleichen Zahlen bei gleichem Bar Code)
Woran könnte das liegen und weswegen habe ich diese Fehlermeldungen?
Müsste ich nicht auch irgendwo die SPI Kommunikation einstellen, wie z.B. serial Clock, communication Pin,..
Danke im voraus ![]()
#include <usbhid.h>
#include <usbhub.h>
#include <hiduniversal.h>
#include <hidboot.h>
#include <SPI.h>
class MyParser : public HIDReportParser {
public:
MyParser();
void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
protected:
uint8_t KeyToAscii(bool upper, uint8_t mod, uint8_t key);
virtual void OnKeyScanned(bool upper, uint8_t mod, uint8_t key);
virtual void OnScanFinished();
};
MyParser::MyParser() {}
void MyParser::Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) {
// If error or empty, return
if (buf[2] == 1 || buf[2] == 0) return;
for (uint8_t i = 7; i >= 2; i--) {
// If empty, skip
if (buf[i] == 0) continue;
// If enter signal emitted, scan finished
if (buf[i] == UHS_HID_BOOT_KEY_ENTER) {
OnScanFinished();
}
// If not, continue normally
else {
// If bit position not in 2, it's uppercase words
OnKeyScanned(i > 2, buf, buf[i]);
}
return;
}
}
uint8_t MyParser::KeyToAscii(bool upper, uint8_t mod, uint8_t key) {
// Letters
if (VALUE_WITHIN(key, 0x04, 0x1d)) {
if (upper) return (key - 4 + 'A');
else return (key - 4 + 'a');
}
// Numbers
else if (VALUE_WITHIN(key, 0x1e, 0x27)) {
return ((key == UHS_HID_BOOT_KEY_ZERO) ? '0' : key - 0x1e + '1');
}
return 0;
}
void MyParser::OnKeyScanned(bool upper, uint8_t mod, uint8_t key) {
uint8_t ascii = KeyToAscii(upper, mod, key);
Serial.print((char)ascii);
}
void MyParser::OnScanFinished() {
Serial.println(" - Finished");
}
USB Usb;
USBHub Hub(&Usb);
HIDUniversal Hid(&Usb);
MyParser Parser;
void setup() {
Serial.begin( 115200 );
Serial.println("Start");
if (Usb.Init() == -1) {
Serial.println("OSC did not start.");
}
delay( 200 );
Hid.SetReportParser(0, &Parser);
}
void loop() {
Usb.Task();
}
C:\Users\Tom\Documents\Arduino\sketch_SPI\sketch_SPI.ino: In member function 'virtual void MyParser::Parse(USBHID*, bool, uint8_t, uint8_t*)':
C:\Users\Tom\Documents\Arduino\sketch_SPI\sketch_SPI.ino:35:38: warning: invalid conversion from 'uint8_t* {aka unsigned char*}' to 'uint8_t {aka unsigned char}' [-fpermissive]
OnKeyScanned(i > 2, buf, buf[i]);
^
C:\Users\Tom\Documents\Arduino\sketch_SPI\sketch_SPI.ino:13:18: note: initializing argument 2 of 'virtual void MyParser::OnKeyScanned(bool, uint8_t, uint8_t)'
virtual void OnKeyScanned(bool upper, uint8_t mod, uint8_t key);
^