USB条码枪的显示

之前有写过 USB条码枪改直显和蓝牙,https://www.arduino.cn/forum.php?mod=viewthread&tid=23635&fromuid=36850

最近看到有些朋友在问,觉得有些奇怪,于是又买了一个条码枪重新实验。很快发现之前的代码无法在新的条码枪上使用。原因如下:

1.USB 条码枪 USB 数据结构有变化。换句话说,之前的那个条码枪更像是单纯的键盘,可以响应 Boot Protocol,但是新的不行。
2. USB HOST Shield 库有变化,会导致编译不过。

于是,重新实验编写了如下的代码:

barcs.ino

#include <SPI.h>
#include "bcsParser.h"
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);  

USB Usb;
MSPARSER msparser(&Usb);

bool printTilt;

void setup() {
  Serial.begin(115200);
  lcd.init();
  
  if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1); // Halt
  }
  Serial.println(F("Barcode scaner\n\r"));
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Barcode scaner");
}

void loop() {
  Usb.Task();

  if (msparser.connected()) {
    
    }

}

 

bcsParser.cpp

#include "bcsParser.h"
#include <Mouse.h>
#include <LiquidCrystal_I2C.h>

extern LiquidCrystal_I2C lcd;
#define VALUE_WITHIN(v,l,h) (((v)>=(l)) && ((v)<=(h)))

uint8_t OemToAscii(uint8_t key) {
        
        // [1-9]
        if (VALUE_WITHIN(key, 0x1e, 0x26)) {
                        return (key -0x1e +1 +'0');
        }// Numbers
        //[0]
        if (key == 0x27) {return '0';}

        if (key == 0x28) {return 13;}
        // [1-9]
        if (VALUE_WITHIN(key, 0x04, 0x1D)) {
                        return (key - 0x04+'A');
        }// Alpha        

        return (0x00);
}

//解析USB鼠标的数据
void MSPARSER::ParseHIDData(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) {
        if (HIDUniversal::VID != STEELSERIES_VID || HIDUniversal::PID != STEELSERIES_SRWS1_PID) 
                return;

        if (len && buf)  {
          /*
                //输出收到的数据
                for (uint8_t i = 0; i < len; i++) {
                        if (buf[i]<0x10) {Serial.print("0");}
                        Serial.print(buf[i],HEX);
                        Serial.print(" ");
                }
                Serial.println();
          */
          
          char c=(OemToAscii(buf[2])&0xFF);
          if (c==13) {
            Serial.println(" "); 
              lcd.setCursor(0,1);
              lcd.print(s);
              Serial.print(s);
              for (int i=0;i<16-s.length();i++) {
                    Serial.print(" ");
                }
              s="";

            }
          else
          if (c!=0x00) {
                //输出收到的数据
                //Serial.print(c); 
                s=s+c;
                }
                 
              
          
        }
}

 

bcsParser.h

#ifndef __srws1_h__
#define __srws1_h__

#include <hiduniversal.h>

#define STEELSERIES_VID       0xFFFF
#define STEELSERIES_SRWS1_PID 0x0035

class MSPARSER : public HIDUniversal {
public:
        MSPARSER(USB *p) : HIDUniversal(p) {};
        bool connected() {
                return HIDUniversal::isReady() && HIDUniversal::VID == STEELSERIES_VID && HIDUniversal::PID == STEELSERIES_SRWS1_PID;
        };

private:
        void ParseHIDData(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf); // Called by the HIDUniversal library
        uint8_t OnInitSuccessful() { // Called by the HIDUniversal library on success
                if (HIDUniversal::VID != STEELSERIES_VID || HIDUniversal::PID != STEELSERIES_SRWS1_PID) // Make sure the right device is actually connected
                        return 1;
                return 0;
        };
        String s;
};

#endif

 

硬件上是Uno + USB Host Shield 插在一起就可以了。

照片上还有一个充放电管理板和功能没关系,普通用户可以直接使用充电宝之类给Uno供电。

完整代码下载

barcs

发表评论

电子邮件地址不会被公开。 必填项已用*标注