В наличии: есть сканер штрих кодов и принтер штрих кодов. И Ардуино УНО (нано тоже есть. меги нет) Сканер и принтер имеют разъемы RS232 Мама сканер: mercury 1000 принтер: custom vkp80ii rs232+usb h8sx ejc--m cn Задача а) Через ардуино уно или нано, не подключённую к компьютеру, напечатать штрих код на принтере (любые произвольные цифры для начала) б) Через ардуино уно или нано, не подключенную к компьютеру, отсканировать любой штрих код для дальнейшей обработки Что сделано: а) Начал со сканера. б) Приобрел конвертор RS232 to TTL вместе с разъемом DB9F мама в) Сделал переходник, соединив между собой два компьютерных шлейфа с разъемами DB9M Папа на концах между собой. При соединении перекрестил 2й и третий контакт между собой. как на схеме (см картинку). Т.е. Tx-Rx и наоборот г) подключил сканер через переходник к конвертору, а через него к ардуино уно на пины 10 и 11. Организовал с помощью библиотеки SoftwareSerial программный Serial Вначале было TX с конвертора на 10 пин. но ничего не происходило. (см этот вариант на схеме) Поменял местами провода к ардуино и TX с конвертора послал на 11 пин.(см и этот вариант на схеме) На ардуино стал мигать светодиод TX Ардуино подключен к компьютеру и в качестве питания ардуины и в качестве получения данных с ком порта. Сканер питается отдельно +5в. д) Пытаюсь получить принимаемые данные со сканера в ардуино. Но тут для меня возник тупик: Ардуино данные принимает, но получить мне их через монитор Com порта не удается. е) сделал вот такой скетч, который при наличии чего-либо в SoftwareSerial выдает маркер "gggggg" так вот, при каждом считывании сканером штрих кода на мониторе сом порта компьютера (через ардуино IDE) вижу 16 повторов маркера "gggggg" Вопрос: что не так, в какую сторону копать? Про печать с ардуино на принтере, если у кого есть инфо просьба поделится. Спасибо Скетч: ====================== Код (C++): #include <SoftwareSerial.h> SoftwareSerial Serial1(10, 11); // RX, TX /* Схема: * RX - цифровой вывод 10 (необходимо соединить с выводом TX другого устройства) * TX - цифровой вывод 11 (необходимо соединить с выводом RX другого устройства) так у меня не заработало заменил на * RX - цифровой вывод 10 (соединил с выводом RX другого устройства TX другого устройства) * TX - цифровой вывод 11 (соединил с выводом TX другого устройства ) */ void setup() { // Инициализируем последовательный интерфейс и ждем открытия порта: Serial.begin(9600); Serial.println("Goodnig"); // устанавливаем скорость передачи данных для последовательного порта, созданного // библиотекой SoftwareSerial Serial1.begin(9600); } void loop() // выполняется циклически { if (Serial1.available()) { Serial.write("gggggg"); Serial.write(Serial1.read()); } }
Чота ору сегодня Вопрос1— Для чего используете програмный Serial? Вопрос2—Какой Serial завпускаете в Setup? Вопрос3—Зачем одно и тоже писать в двух разных темах?
про скетч куда вставлять понял, спасибо. Исправил в первом посте. ответы на вопросы: 1. программный использую потому, что аппаратный нужен что бы на компе видеть что ардуино принимает от сканера 2. Serial.begin(9600); стандартный - аппаратный, по нему обмен с компьютером Serial1.begin(9600); программный 3. первая тема, в которой писал, все же немного уже чем моя, и люди которые будут по поиску в яндексе искать, проще будет найти кроме того та тема у человека фактически исчерпана. и если бы ветка продолжалась, то тема увела бы в сторону. А новичку всегда сложнее в таком разбираться. знаю по себе. Ну и последнее, в этой теме я очень подробно все изложил и дал картинки, и мне может больше ответят и другим будет легче идти по моим стопам, если у меня получится решить проблему И еще, в той теме автор работает с Ардуино Мега, а у меня Ардуино УНО. Нет второго аппаратного Serial/ Все - таки для многих это большая разница
Не сильно рублю в Си, но кажется - 1. Serial.write () используется для передачи байта. А вы передаете строку. Используйте -. Serial.print("ggggg"); 2. Не совмещайте Сериал в сериале - Serial.write(Serial1.read()); Лучше принимайте байт в переменную, а потом переменную отправляйте второй командой. Иначе могут возникнуть какие-нибудь артефакты с таймерами. 3. Паровоз прав - ушлые разработчики вполне могут заюзать доп. контакты, типа защиты от копирования.. По-моему так.
вот распиновка кабеля для этого принтера конвертор rs232 to ttl вроде бы использует только 1-5 (верхнюю пятерку контактов.) более пока с этим не разбирался. видет в инете, что вроде бы этот тип принтера может печатать от ардуино (или подобный)
спасибо за идеи пробовал вот такой код Но в монитор получил только ключи, значений не было Код из местного форума. правда у автора ардуино мега и у него 2 аппаратных Serial. Привожу его код, так как проще . свой удалил. разница в активации второго Serial1 Код (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.print(incomingBarCode[i]); } } }
Сканер питается через этот же разъем ? Так как оборудование фирменное - они всегда могут "нестандартить" с разъемами.
СПАСИБО!. Вы правы!! воспользовался вашей идеей про serial.print вот что получил (появились значения): ключ - значение HAVE DATA 0 - 52 1 - 54 2 - 48 3 - 48 4 - 56 5 - 50 6 - 51 7 - 48 8 - 49 9 - 53 10 - 48 11 - 54 12 - 55 13 - 13 14 - 10 Что с ними делать пока не знаю. Код (C++): #include <SoftwareSerial.h> //SoftwareSerial mySerial(10, 11); // RX, TX SoftwareSerial Serial1(10, 11); // RX, TX // Размер массива для полученных Byte. const byte incomingBarCodeLength = 15; // Массив для полученных Byte. byte incomingBarCode[incomingBarCodeLength]; /* Схема: * RX - цифровой вывод 10 (необходимо соединить с выводом TX другого устройства) * TX - цифровой вывод 11 (необходимо соединить с выводом RX другого устройства) */ void setup() { // Инициализируем последовательный интерфейс и ждем открытия порта: Serial.begin(9600); Serial.println("Goodnig"); // устанавливаем скорость передачи данных для последовательного порта, созданного // библиотекой SoftwareSerial //mySerial.begin(9600); Serial1.begin(9600); //mySerial.println("Hello, world?"); // Serial.println("XXXXXXX"); } void loop() // выполняется циклически { // Проверка, есть ли данные. if (Serial1.available()) { Serial.println("HAVE DATA"); // Запись получнных данных в массив. Serial1.readBytes(incomingBarCode, incomingBarCodeLength); // Тест полученных данных. for (byte i = 0; i < incomingBarCodeLength; i++) { Serial.print(" "); Serial.print(i); Serial.print(" - "); Serial.print(incomingBarCode[i]); } } } Сканер питается через это же свой разъем RS232 у него отдельный отвод для БП 5вольт.. GND-5 контакт, как обычно +5 - 6й, который, как и весь нижний ряд, конвертор не использует (я так думаю)
Удалось получить штрих код вот в массиве первые 13 цифр - это штрих код тут формат ключ - (значение -48) проанализировав выдаваемые цифры и повторение цифр в штрих коде сделал вывод, что надо просто вычесть 48 было: 0 - 52 1 - 54 2 - 48 3 - 48 4 - 56 5 - 50 6 - 51 7 - 48 8 - 49 9 - 53 10 - 48 11 - 54 12 - 55 13 - 13 14 - 10 получилось 0 - 4 1 - 6 2 - 0 3 - 0 4 - 8 5 - 2 6 - 3 7 - 0 8 - 1 9 - 5 10 - 0 11 - 6 12 - 7 13 - -35 14 - -38 код 4600823015067 упростил до Код (C++): for (byte i = 0; i <13; i++) { Serial.print(incomingBarCode[i]-48); } цифровые коды читает хорошо, а вот те что имеют буквы - с ними проблемы "С одним поросенком разобрались" фраза из фильма
Всё верно. Символы чисел в ASCII таблице сдвинуты именно на эту величину. Сканер выдаёт числа в виде чисел, а принтер печатает их символы.
спасибо, а как тогда быть с буквами? все что нашел по выводу Serial.print(78, BIN); // вывод "1001110" Serial.print(78, OCT); // вывод "116" Serial.print(78, DEC); // вывод "78" Serial.print(78, HEX); // вывод "4E" Serial.print(1.23456, 0); // вывод "1" Serial.print(1.23456, 2); // вывод "1.23" Serial.print(1.23456, 4); // вывод "1.2345" попробовал так, но не прокатило. Serial.print(byte(78)) передается как "N" (т.к. в таблице ASCII "N" под 78 номером) в моем случае Serial.print(byte(incomingBarCode));// передается как "N" (т.к. в таблице ASCII "N" под 78 номером)
спасибо, разобрался уже. поздно голова совсем плохо варит. Хотелось бы еще разобраться как и буквы считывать. Пока не надо, но вдруг понадобится. Да и так, для общего развития. любопытно.