最近看到有些朋友在问,觉得有些奇怪,于是又买了一个条码枪重新实验。很快发现之前的代码无法在新的条码枪上使用。原因如下:
1.USB 条码枪 USB 数据结构有变化。换句话说,之前的那个条码枪更像是单纯的键盘,可以响应Boot Protocol,但是新的不行。 2. USB HOST Shield 库有变化,会导致编译不过。
于是,重新实验编写了如下的代码:
barcs.ino
[pre]#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 amessage to the LCD.
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Barcode scaner");
}
void loop() {
Usb.Task();
if(msparser.connected()) {
}
}[/pre]
bcsParser.cpp
[pre]#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, boolis_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<0x10){Serial.print("0");}
Serial.print(buf,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;
}
}
}[/pre]
bcsParser.h
[pre]#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) {};
boolconnected() {
return HIDUniversal::isReady() && HIDUniversal::VID ==STEELSERIES_VID && HIDUniversal::PID == STEELSERIES_SRWS1_PID;
};
private:
voidParseHIDData(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf); // Calledby the HIDUniversal library
uint8_t OnInitSuccessful() { // Called by the HIDUniversal library onsuccess
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[/pre]
硬件上是Uno + USB Host Shield 插在一起就可以了。
照片上还有一个充放电管理板和功能没关系,普通用户可以直接使用充电宝之类给Uno供电。
|