尝试让条形码扫描仪与Arduino一起工作

Trying To Get A Barcode Scanner Working With Arduino

本文关键字:Arduino 一起 工作 扫描仪 条形码      更新时间:2023-10-16

我正在尝试让我的条形码扫描仪与我的Arduino Mega一起工作(我使用的是霍尼韦尔Eclipse 5145( 尽管我从其他两个问题中得到了帮助,但我似乎仍然无法使其完全正常工作。

我让条形码扫描仪将条形码编号正确发送到串行监视器,但我尝试向变量添加 If 语句,以便

If ([Placeholder]==(char)ascii { digitalWrite(22, HIGH); delay(1000);
digitalWrite(22, LOW); }

但这行不通。有人告诉我,函数 ascii一次只存储一个字符,因此它会一个接一个地输出字符,而不是在一个字符串中。我一直在尝试解决这个问题一段时间,但似乎无法让它工作。我也不知道我应该把代码放在我的项目中的哪里。

这是我当前的代码,

#include <usbhid.h>
#include <usbhub.h>
#include <hiduniversal.h>
#include <hidboot.h>
#include <SPI.h>
char scan;
//Barcodes
char Barcode1[] = {'7','6','2','2','2','1','0','4','1','1','0','0','6',''};
char Barcode2[] = {"8717644012208 "};
class MyParser : public HIDReportParser {
public:
MyParser();
void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
protected:
uint8_t KeyToAscii(bool upper, uint8_t mod, uint8_t key);
virtual void OnKeyScanned(bool upper, uint8_t mod, uint8_t key);
virtual void OnScanFinished();
};
MyParser::MyParser() {}
void MyParser::Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) {
if (buf[2] == 1 || buf[2] == 0) return;
for (uint8_t i = 7; i >= 2; i--) {
if (buf[i] == 0) continue;
if (buf[i] == UHS_HID_BOOT_KEY_ENTER) {
OnScanFinished();
}
else {
OnKeyScanned(i > 2, buf, buf[i]);
}
return;
}
}
uint8_t MyParser::KeyToAscii(bool upper, uint8_t mod, uint8_t key) {
if (VALUE_WITHIN(key, 0x04, 0x1d)) {
if (upper) return (key - 4 + 'A');
else return (key - 4 + 'a');
}
else if (VALUE_WITHIN(key, 0x1e, 0x27)) {
return ((key == UHS_HID_BOOT_KEY_ZERO) ? '0' : key - 0x1e + '1');
}
return 0;
}
void MyParser::OnKeyScanned(bool upper, uint8_t mod, uint8_t key) {
uint8_t ascii = KeyToAscii(upper, mod, key);
Serial.print((char)ascii);
scan = (char)ascii;
}

void MyParser::OnScanFinished() {
Serial.println(" - Finished");
}
USB          Usb;
USBHub       Hub(&Usb);
HIDUniversal Hid(&Usb);
MyParser     Parser;
void setup() {
Serial.begin( 115200 );
Serial.println("Start");
if (Usb.Init() == -1) {
Serial.println("OSC did not start.");
}
delay( 200 );
Hid.SetReportParser(0, &Parser);
}
void loop() {
Usb.Task();
}

我想我以某种方式需要一个变量来存储从函数ascii接收所有字符时的数据,然后在 If 语句中使用该变量而不是(char)ascii.如果您有任何问题,请在下面发表评论,我会尽力回答(我对ascii不太熟悉(

如果可能,请提供示例

谢谢

class MyParser : public HIDReportParser {
public:
MyParser();
void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
protected:
char KeyToAscii(bool upper, uint8_t mod, uint8_t key);
virtual void OnKeyScanned(bool upper, uint8_t mod, uint8_t key);
virtual void OnScanFinished();
};
char MyParser::KeyToAscii(bool upper, uint8_t mod, uint8_t key) {
if (VALUE_WITHIN(key, 0x04, 0x1d)) {
if (upper) return (key - 4 + 'A');
else return (key - 4 + 'a');
}
else if (VALUE_WITHIN(key, 0x1e, 0x27)) {
return ((key == UHS_HID_BOOT_KEY_ZERO) ? '0' : key - 0x1e + '1');
}
return 0;
}

这允许

void MyParser::OnKeyScanned(bool upper, uint8_t mod, uint8_t key) {
scan = KeyToAscii(upper, mod, key);
Serial.print(scan);
}

这为谢夫和我的评论提供了一个样本。 您的问题以及您在比较字符和设置 Arduino 输出方面的问题我还不清楚。