Преобразование штрих кода в строку
- Войдите на сайт для отправки комментариев
Втр, 06/03/2018 - 13:52
Здравствуйте! не могу решить проблемму при сканировании штрих кода выдает только первый символ. Сканер USB подлюченный через Shield.
#include <hid.h> #include <hiduniversal.h> #include <usbhub.h> #include <Usb.h> #include <hidboot.h> #include <avr/pgmspace.h> #include <Wire.h> //I2C #include <LiquidCrystal_I2C.h> //LCD #include <Ultrasonic.h> //Sonar #include <SoftwareSerial.h> SoftwareSerial mySerial(6, 5);//RX, TX LiquidCrystal_I2C lcd(0x3F,16,2); // set the LCD address to 0x27 or 0x3F for a 16 chars and 2 line display Ultrasonic axisX(8,9); // (Trig PIN,Echo PIN) Ultrasonic axisY(10,11); // (Trig PIN,Echo PIN) Ultrasonic axisZ(12,13); // (Trig PIN,Echo PIN) String SSID ="meest"; String PASS="sash5845"; #define DST_IP "8.8.8.8" //DIST_IP class BarcodeReader : public KeyboardReportParser { USB Usb; USBHub Hub; HIDUniversal Hid; HIDBoot<HID_PROTOCOL_KEYBOARD> Keyboard; uint8_t buffer[15]; byte length; bool valid; void addCharacter(uint8_t c); public: BarcodeReader(); void begin(); void task(); const uint8_t* barcode(); void reset(); protected: virtual void OnKeyDown(uint8_t mod, uint8_t key); }; BarcodeReader::BarcodeReader() : Usb() , Hub(&Usb) , Hid(&Usb) , Keyboard(&Usb) , length(0) , valid(false) { } void BarcodeReader::begin() { if (Usb.Init() == -1) { Serial.println("OSC did not start."); } Hid.SetReportParser(1, this); } void BarcodeReader::task() { Usb.Task(); } void BarcodeReader::addCharacter(uint8_t c) { if (valid) { // already have a barcode, new one will overwrite it reset(); } buffer[length++] = c; //buffer[length] = '\0'; if (buffer[length] == '\0') { valid = true; } }; const uint8_t* BarcodeReader::barcode() { return (valid) ? buffer : 0; } void BarcodeReader::reset() { length = 0; valid = false; } void BarcodeReader::OnKeyDown(uint8_t mod, uint8_t key) { uint8_t c = OemToAscii(mod, key); if (c) addCharacter(c); } BarcodeReader barcodeReader; void setup() { Serial.begin(9600); mySerial.begin(115200); lcd.begin(); lcd.begin(); lcd.backlight(); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Hello"); delay(5000); Serial.println("Init"); mySerial.println("AT+RST"); // сброс и проверка, если модуль готов delay(1000); if(mySerial.find("OK")) {Serial.println("WiFi - Module is ready");} else {Serial.println("Module dosn't respond."); while(1); } delay(1000); // соединение по wifi boolean connected=false; for(int i=0;i<5;i++) { if(connectWiFi()) {connected = true; mySerial.println("Connected to Wi-Fi..."); break; } } if (!connected) { mySerial.println("Coudn't connect to Wi-Fi."); while(1); } delay(5000); mySerial.println("AT+CIPMUX=0"); // режим одиночного соединения barcodeReader.begin(); } void loop() { barcodeReader.task(); char* barcode = barcodeReader.barcode(); if (barcode) { String cmd = "AT+CIPSTART=\"TCP\",\""; cmd += DST_IP; cmd += "\",8283"; Serial.println(cmd); mySerial.println(cmd); if(mySerial.find("Error")) return; double width = 100-axisX.Ranging(CM); Serial.println(width); delay(50); double lenght = 100-axisY.Ranging(CM); Serial.println(lenght); delay(50); double height = 100-axisZ.Ranging(CM); Serial.println(height); delay(50); delay(10000); long format = (width*lenght*height)/1000000; Serial.println(format); lcd.clear(); lcd.setCursor (2,0); lcd.print(width); lcd.print("x"); lcd.print(lenght); lcd.print("x"); lcd.print(height); lcd.print("cm"); lcd.setCursor (4,1); lcd.print ("V=" ); lcd.print(format); lcd.print ("M.kyb"); cmd = "#A0:F3:C1:70:AA:94\n#2881C4BA0200003B1#"+String(format)+"\n##"+barcode; delay(3000); mySerial.print("AT+CIPSEND="); mySerial.println(cmd.length()); Serial.println(">"); mySerial.print(cmd); Serial.println(cmd); mySerial.println("AT+CIPCLOSE"); barcodeReader.reset(); } } // процедура установки Wi-Fi-соединения boolean connectWiFi() { String cmd="AT+CWJAP=\"" +SSID+"\",\"" + PASS + "\""; mySerial.println(cmd); Serial.println(cmd); delay(2000); if(mySerial.find("OK")) { Serial.println("OK, Connected to Wi-Fi."); return true; } else { Serial.println("Can not connect to the Wi-Fi."); return false; } }
В Вашем сообщении не было вопроса (было лишь утверждение, что Вы не можете решить проблему). Обычно в таких случаях я отвечаю "принято к сведению", но так и быть ... только впредь формулируйте свои вопросы чётко.
Ну, а чего Вы хотели?
Изначально вся память глобальных переменных обнулена. Вот пришёл к Вам самый первый символ, вызывается функция addCharacter. В ней Вы проверяете valid, и, поскольку он false, добавляете этот символ в буфер. Затем в строке 85 Вы проверяете, а не ноль ли в следующем символе в буфере (а там именно 0, т.к. изначально буфер весь заполнен нулями). Ну, а раз 0, то Вы делаете valid истиной и больше никаких символов в буфер не добавляете, та.к. срабатывает проверка в строке 75.
Спасибо за подсказку, попробовал но тогда не отрабатывает 157 и соответственно 159 строчки
Я не знаю, что Вы пробовали. То, что я видел больше одного символа в принципе вводить не предназначено, а что Вы там пробовали ... Вы держите в секрете.
Пробовал кучу всего. И не могу понять почему сканер возвращает только первый символ. Хочу чтоб штрих код передвался по вай фай в переменной cmd Подскажите новичку люди добрые.
Вот вывод в консоль
Даже не знаю, что Вам ещё сказать.
Ошибка подробно описана в посте #1. А в посте #4 Вы публикуете скетч в котором эта самая ошибка не только не исправлена, а даже усугублена (уж для верности).
Вот Ваш код из поста #4
Смотрите на строку 11. Вы точно понимаете, что она делает? На всякий случай, она делает buffer[length] рвным '\0'.
А что делается в строке 13? А в строке 13 Вы проверяеете а равна ли buffer[length] значению '\0' или, может, не равна.
ну и каков результат проверки, если Вы её только что принудительно сделали '\0'.
Разумеется, "равна". Вот Вы и заканчиваете чтение баркода после первого же символа.
Исправляйте ошибки-то, а не усугубляйте их.
Спасибо, да что-то я натупил. Подправил, но всеравно не так как хочу работает. Буду ковырять дальше
Я конечно обнаглел, но Вы смогли б написать как оно должно работать.
Не мог бы, т.к. у меня нет ни этой приблуды, для чтения кодов, ни документации по ней, и я понятия не имею как она должна работать. То, как у Вас написано работать не должно, это я вижу. А как должно - я просто не знаю.
Вот это пытались переводить или просто копипастили код с arduino.cc ?