之前有写过 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供电。
完整代码下载