Arduino Usb Scanner Problem

Hello,

I have a question about using the USB Host Library 2.0 Bellow is the code. What i’m trying to do is when i scan a barcode to light a led, then wait until a switch is pressed to make it go off. The problem is when i scan the code, the scanner beeps 3 times and the red light comes up with error, like the buffer is not empty or something like that. I don’t know how to make the program to wait until the switch is pressed without the scanner entering in error mode.

Anyone can help? Thanks for your time. :slight_smile:

/*
 
Portable barcode scanner. Uses USB HID barcode scanner, Arduino Board, USB Host Shield and HD44780-compatible LCD display
 
  The circuit:
 * LCD RS pin to digital pin 7
 * LCD Enable pin to digital pin 6
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 
*/
#include <string.h> 
#include <SPP.h>
#include <LiquidCrystal.h>
#include <avr/pgmspace.h>
#include <SPI.h> 
//#include <avrpins.h>
//#include <max3421e.h>
//#include <usbhost.h>
//#include <usb_ch9.h>
#include <Usb.h>
#include <usbhub.h>
#include <avr/pgmspace.h>
//#include <address.h>
#include <hidboot.h>
#include <hid.h>
#include <hiduniversal.h>
 
//#include <printhex.h>
//#include <message.h>
//#include <hexdump.h>
//#include <parsetools.h>
 
#define DISPLAY_WIDTH 16

const int button1 =  32;
const int button2 =  48;
const int ledPin1 =  8;
const int ledPin2 =  44;

String myString;
int val;
 
// initialize the LCD library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
 
USB     Usb;
USBHub     Hub(&Usb);
HIDUniversal   Hid(&Usb);
HIDBoot<HID_PROTOCOL_KEYBOARD>    Keyboard(&Usb);
 
class KbdRptParser : public KeyboardReportParser
{
     void PrintKey(uint8_t mod, uint8_t key);
     
protected:
	virtual void OnKeyDown	(uint8_t mod, uint8_t key);
	virtual void OnKeyPressed(uint8_t key);
};
 
void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)	
{
    uint8_t c = OemToAscii(mod, key);
 
    if (c)
        OnKeyPressed(c);
}
 
/* what to do when symbol arrives */
 void KbdRptParser::OnKeyPressed(uint8_t key)	
{
static uint32_t next_time = 0;      //watchdog
static uint8_t current_cursor = 0;  //tracks current cursor position  
 
    if( millis() > next_time ) {
      lcd.clear();
      current_cursor = 0;
      delay( 5 );  //LCD-specific 
      lcd.setCursor( 0,0 );
    }//if( millis() > next_time ...
 
    next_time = millis() + 200;  //reset watchdog
 
    if( current_cursor++ == ( DISPLAY_WIDTH + 1 )) {  //switch to second line if cursor outside the screen
      lcd.setCursor( 0,1 );
    }
    
    val += key;   
    myString += char(key);
    //Serial.print(char(key));
    //Serial.println(key);    
    if (key==19){
          Serial.println(myString);
          Serial.println(val);
         
    switch (val) {
    case 274:         
          digitalWrite(ledPin1,HIGH);
          myString="";
          val=0;
          do {}
                while (digitalRead(button1)==HIGH);
          digitalWrite(ledPin1,LOW);
          
          break;
    case 530:
          digitalWrite(ledPin2,HIGH);
          myString="";
          val=0;
          do {}
                while (digitalRead(button2)==HIGH);
          digitalWrite(ledPin2,LOW);  
          break;
    default:
          myString="";
          val=0;
          break;
  }
            } 
                                 
    lcd.print( char(key) );
};
 
KbdRptParser Prs;
 
void setup()
{
    Serial.begin( 115200 );
    Serial.println("Start");
    
    if (Usb.Init() == -1) {
        Serial.println("OSC did not start.");
    }
 
    delay( 200 );
 
    Hid.SetReportParser(0, (HIDReportParser*)&Prs);
    // set up the LCD's number of columns and rows: 
    lcd.begin(DISPLAY_WIDTH, 2);
    lcd.clear();
    lcd.noAutoscroll();
    lcd.print("Ready");
    delay( 200 );
   
    pinMode(ledPin1,OUTPUT);
    pinMode(ledPin2,OUTPUT);
    pinMode(button1,INPUT_PULLUP);
    pinMode(button2,INPUT_PULLUP);
}
 
void loop()
{
  Usb.Task();
  
}

I really need a suggestion if anyone could help?

Do you have a simpler sketch that only exercises the scanner?

Do you mean that the part that prints on the serial monitor the scanned barcode values?

Do you mean the part that prints on the serial monitor the scanned barcode values?

This is the part that prints on serial the values and the scanner enter in error mode when do while loop is being called:

val += key;   
    myString += char(key);
    //Serial.print(char(key));
    //Serial.println(key);    
    if (key==19){
          Serial.println(myString);
          Serial.println(val);
         
    switch (val) {
    case 274:         
          digitalWrite(ledPin1,HIGH);
          myString="";
          val=0;
          do {}
                while (digitalRead(button1)==HIGH);
          digitalWrite(ledPin1,LOW);
          
          break;
    case 530:
          digitalWrite(ledPin2,HIGH);
          myString="";
          val=0;
          do {}
                while (digitalRead(button2)==HIGH);
          digitalWrite(ledPin2,LOW);  
          break;
    default:
          myString="";
          val=0;
          break;
  }

Anyone more experienced with some help please?