USB 条码枪读取和显示-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9856|回复: 19

USB 条码枪读取和显示

[复制链接]
发表于 2018-8-30 21:17 | 显示全部楼层 |阅读模式
之前有写过 USB条码枪改直显和蓝牙,https://www.arduino.cn/forum.php ... 23635&fromuid=36850

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

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 插在一起就可以了。
image002.jpg

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


barcs.zip

1.95 KB, 下载次数: 75

发表于 2018-8-31 12:25 | 显示全部楼层
给大佬点个赞
发表于 2018-9-3 13:17 | 显示全部楼层
本帖最后由 ming3834436 于 2018-9-3 13:18 编辑

不知道是什么原因

捕获.PNG
发表于 2018-9-3 16:18 | 显示全部楼层
请问怎么直接在arduino ide的串口显示出来?
 楼主| 发表于 2018-9-3 20:50 | 显示全部楼层
ming3834436 发表于 2018-9-3 16:18
请问怎么直接在arduino ide的串口显示出来?

代码中对 lcd print 的直接serial.print 就好了
发表于 2018-9-4 09:37 | 显示全部楼层
本帖最后由 ming3834436 于 2018-9-4 13:19 编辑
Zoologist 发表于 2018-9-3 20:50
代码中对 lcd print 的直接serial.print 就好了

谢谢你回复我,还是不能在Arduino窗口上完全显示条码 。打开后才只会显示  Barcode scaner, 我用的扫描枪DS9208.
发表于 2018-9-8 13:13 | 显示全部楼层
本帖最后由 ming3834436 于 2018-9-8 13:29 编辑

大佬能不能提供一下 hiduniversal.h 文件。谢谢
 楼主| 发表于 2018-9-9 08:17 | 显示全部楼层
ming3834436 发表于 2018-9-8 13:13
大佬能不能提供一下 hiduniversal.h 文件。谢谢

这是Usb host 2.0 自带的库,你安装一下就有了
发表于 2018-9-10 21:59 来自手机 | 显示全部楼层
我的扫描枪还是读不到数据,求助。
发表于 2018-9-17 00:38 来自手机 | 显示全部楼层
二维码可以?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 11:53 , Processed in 0.113517 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表