Приветствую. Подскажите, пожалуйста, в какой стороне искать проблему. Используется 1. Arduino Mega 2560 2. RS232 to TTL Serial Transceiver Module for Arduino на Max3232 - http://www.ti.com/lit/ds/symlink/max3232.pdf. Подключение TX от модуля на RX arduino (19 pin), RX от модуля на TX arduino (18 pin) 3. Сканер Honeywell MS9520 версии 41, руководство программирования - https://country.honeywellaidc.com/CatalogDocuments/00-02544 Rev K 2-11.pdf Сканер работает с RS232 +/-12V. Он настроен на передачу по RS232 (в описании настройки с 59 страницы) 9600 BAUD Rate, No Parity, 8 Data Bits,1 Stop Bit все остальное по умолчанию. Код, вроде бы ни чего особенного, взял от сюда - http://arduino.ru/Reference/Serial/Available Код (C++): void setup() { Serial.begin(9600); Serial1.begin(9600); } void loop() { // read from port 1, send to port 0: if (Serial1.available()) { int inByte = Serial1.read(); Serial.print(inByte, BYTE); } } В мониторе порта тишина, хоть бы мусор какой-нибудь прислал. Возможно глаз замылился. Как я понимаю, нужно идти по шагам, убедиться, что сам сканер шлет хоть какие-то данные и т.д.
После продолжительных праздников, добрался до своей задачи. Проблема подключения решена, все оказалось очень просто. Взял переходник RS-232 к USB и проверил сканер, после настройки он исправно слал штрих-код на компьютер (использовал программу PuTTY). Затем взял модуль RS232 to TTL и подключил его к Arduino Mega 2560 на Serial1. Залил код Код (C++): void setup() { Serial.begin(9600); Serial1.begin(9600); } void loop() { if (Serial1.available()) { Serial1.print("Received "); Serial1.write(Serial1.read()); Serial1.println(""); } } и через монитор порта Arduino IDE, проверил и RS232 to TTL и Arduino. Проблема оказалась в соединении между модулем RS232 to TTL и моим сканером. У сканера и модуля порт подключения RS232 "мама", пришлось паять провод для их подключения. В этом проводе нужно было соединить с одной стороны RX, а с другой стороны TX. Подключил, как описывал в начале, залил этот код Код (C++): void setup() { Serial.begin(9600); Serial1.begin(9600); } void loop() { // read from port 1, send to port 0: if (Serial1.available()) { Serial.write(Serial1.read()); } } и все заработало. Теперь можно заняться самой программой.
Вот видите, по шагам, как всё прекрасно получается. А какой ответ, кроме как "проверьте соединения" вы расчитывали тут услышать? Шанс того, что найдете второго такого человека, с такими же устройствами, крайне мал. А если бы задали вопрос так "Не работает считыватель штрих-кода с ардуино, памагите!" то могли бы расчитывать на кучу разных откликов Удачи в работе!
Когда создавал тему не был уверен в модуле, в электронике делаю первые шаги. Думал, мне сразу укажут на не правильный выбор модуля RS232 to TTL. Спасибо.
С получением и форматом данных разобрался. По считывателю просто тонна документации, но быстро найти описания формата данных не удалось. Скачал программу COM Port Toolkit и получил такой пакет данных (штрих код EAN13, 4810046004735) 000001 20:51:31.268 34 38 31 30 30 34 36 30 30 34 37 33 35 0D 0A 4810046004735.. Последние точки заинтриговали, как выяснилось это CR и LF. Подробнее тут - https://ru.wikipedia.org/wiki/Перевод_строки#В_ASCII Код для получения данных. Код (C++): // Размер массива для полученных Byte. const byte incomingBarCodeLength = 15; // Массив для полученных Byte. byte incomingBarCode[incomingBarCodeLength]; // Скорость работы Serial. const int serialSpeed = 9600; // Настройка перед основным циклом. void setup() { Serial.begin(serialSpeed); Serial1.begin(serialSpeed); delay(1000); } // Основной цикл. void loop() { // Проверка, есть ли данные. if (Serial1.available()) { // Запись получнных данных в массив. Serial1.readBytes(incomingBarCode, incomingBarCodeLength); // Тест полученных данных. for (byte i = 0; i < incomingBarCodeLength; i++) { Serial.print(" "); Serial.print(i); Serial.print(" - "); Serial.write(incomingBarCode[i]); } } } Чуть позже, когда я понял что такое CR и LF, нашел их в документации - https://country.honeywellaidc.com/CatalogDocuments/00-02544 Rev K 2-11.pdf стр. 48. Если я правильно понял, можно настраивать пакет данных, но проверить сейчас не могу, нет принтера, чтобы распечатать штрих код настроек. Сканер программируется с помощью штрих кодов, а с экрана он их не читает, только с бумаги.
Подсчет контрольной цифры, для EAN-13 - http://gs1md.org/ru/definirea-cifrei-de-control/ Может использоваться как для дополнительной проверки, так и генерации номера штрих кода. Код (C++): // Размер массива для полученных Byte. const byte incomingBarCodeLength = 15; // Массив для полученных Byte. byte incomingBarCode[incomingBarCodeLength]; // Скорость работы Serial. const int serialSpeed = 9600; // Настройка перед основным циклом. void setup() { Serial.begin(serialSpeed); Serial1.begin(serialSpeed); delay(1000); } // Основной цикл. void loop() { // Проверка, есть ли данные. if (Serial1.available()) { // Запись получнных данных в массив. Serial1.readBytes(incomingBarCode, incomingBarCodeLength); // Подсчет чек. суммы. // http://gs1md.org/ru/definirea-cifrei-de-control/ // Цифры набора нумеруются справа налево. // Подсчитываются суммы цифр, стоящих на четных и нечетных местах. // Сумма цифр, стоящих на четных местах, суммируется с утроенной суммой цифр, стоящих на нечетных местах. // Если цифра единиц полученного результата равна нулю, то контрольная цифра — 0. Если последняя цифра результата не нуль, то контрольная цифра равна дополнению этой цифры до 10. // Пример: Пусть имеется набор цифр в системе EAN-13 — 345678905675 C. // Цифры, стоящие на нечетных местах: 5,6,0,8,6,4. Сумма этих цифр равна 29. // Цифры, стоящие на четных местах:7,5,9,7,5,3 . Сумма этих цифр равна 36. // Результат 3-го шага: 29*3+36=123. // Искомая контрольная цифра C=7, т.к. 7+3 = 10. // Подсчет не четных цифр. // Цифры набора нумеруются справа налево. // Подсчитываются суммы цифр, стоящих на нечетных местах. byte notEvenNumber = incomingBarCode[11]-48 +incomingBarCode[9]-48 +incomingBarCode[7]-48 +incomingBarCode[5]-48 +incomingBarCode[3]-48 +incomingBarCode[1]-48; // Подсчет четных цифр. // Цифры набора нумеруются справа налево. // Подсчитываются суммы цифр, стоящих на четных. byte evenNumber = incomingBarCode[10]-48 +incomingBarCode[8]-48 +incomingBarCode[6]-48 +incomingBarCode[4]-48 +incomingBarCode[2]-48 +incomingBarCode[0]-48; // Сумма цифр, стоящих на четных местах, суммируется с утроенной суммой цифр, стоящих на нечетных местах. byte sumNumber = (notEvenNumber * (byte)3) + evenNumber; Serial.print("notEvenNumber - "); Serial.print(notEvenNumber); Serial.print(" evenNumber - "); Serial.print(evenNumber); Serial.print(" sumNumber - "); Serial.print(sumNumber); // Подсчет чек. суммы. // Если цифра единиц полученного результата равна нулю, то контрольная цифра — 0. Если последняя цифра результата не нуль, то контрольная цифра равна дополнению этой цифры до 10. byte checkSum = ((sumNumber % 100)%10); Serial.print(" checkSum - "); Serial.println(checkSum); } } В принципе, по связке сканер на RS232 и Arduino все.
А вот у меня не работает. У меня Ардуино УНО использую программный Serial вот так ничего в сом порт компьютера не выдает void loop() { // read from port 1, send to port 0: if (Serial1.available()) { Serial.write(Serial1.read()); } а вот с такими доработками: if (Serial1.available()) { Serial.write("gggggg"); Serial.write(Serial1.read()); Мой маркер "gggggg" повторяет 16 раз Я все сделал как писал автор поменял RX и TX на переходнике, и пришлось еще так же против правил соединить TX конвертора с TX ардуино уно Подскажите кто можете! (мы люди не местные) Не могу понять, почему в порт компьютера ничего не выводит, когда там что то есть, маркер то мой выводит. хоть кроказябы какие-то вывел