Взаимодействие реального rs232 прибора и ардуино uno через конвертор rs232 to ttl

Тема в разделе "Arduino & Shields", создана пользователем Дятел, 5 апр 2021.

  1. Дятел

    Дятел Нерд

    В наличии:
    есть сканер штрих кодов и принтер штрих кодов. И Ардуино УНО (нано тоже есть. меги нет)
    Сканер и принтер имеют разъемы 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());
      }
    }
     

    Вложения:

    Последнее редактирование: 5 апр 2021
  2. Airbus

    Airbus Радиохулиган Модератор

    Чота ору сегодня
    [​IMG]
    Вопрос1— Для чего используете програмный Serial?
    Вопрос2—Какой Serial завпускаете в Setup?
    Вопрос3—Зачем одно и тоже писать в двух разных темах?
     
  3. parovoZZ

    parovoZZ Гуру

    В RS232, который в принтаке, есть ещё куча контактов, которые могут использоваться им.
     
  4. Дятел

    Дятел Нерд

     
  5. Дятел

    Дятел Нерд

    про скетч куда вставлять понял, спасибо. Исправил в первом посте.
    ответы на вопросы:
    1. программный использую потому, что аппаратный нужен что бы на компе видеть что ардуино принимает от сканера
    2.
    Serial.begin(9600); стандартный - аппаратный, по нему обмен с компьютером
    Serial1.begin(9600); программный
    3. первая тема, в которой писал, все же немного уже чем моя, и люди которые будут по поиску в яндексе искать, проще будет найти
    кроме того та тема у человека фактически исчерпана. и если бы ветка продолжалась, то тема увела бы в сторону. А новичку всегда сложнее в таком разбираться. знаю по себе.
    Ну и последнее, в этой теме я очень подробно все изложил и дал картинки, и мне может больше ответят и другим будет легче идти по моим стопам, если у меня получится решить проблему
    И еще, в той теме автор работает с Ардуино Мега, а у меня Ардуино УНО. Нет второго аппаратного Serial/ Все - таки для многих это большая разница
     
    Последнее редактирование: 6 апр 2021
  6. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Не сильно рублю в Си, но кажется -
    1. Serial.write () используется для передачи байта. А вы передаете строку. Используйте -.
    Serial.print("ggggg");
    2. Не совмещайте Сериал в сериале - Serial.write(Serial1.read());
    Лучше принимайте байт в переменную, а потом переменную отправляйте второй командой. Иначе могут возникнуть какие-нибудь артефакты с таймерами.
    3. Паровоз прав - ушлые разработчики вполне могут заюзать доп. контакты, типа защиты от копирования..
    По-моему так.
     
    Последнее редактирование: 6 апр 2021
  7. Дятел

    Дятел Нерд

    вот распиновка кабеля для этого принтера
    конвертор rs232 to ttl вроде бы использует только 1-5 (верхнюю пятерку контактов.)
    более пока с этим не разбирался. видет в инете, что вроде бы этот тип принтера может печатать от ардуино (или подобный)
     

    Вложения:

  8. Дятел

    Дятел Нерд

    спасибо за идеи
    пробовал вот такой код
    Но в монитор получил только ключи, значений не было
    Код из местного форума. правда у автора ардуино мега и у него 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]);
        }
      }
    }
     
    Последнее редактирование: 6 апр 2021
  9. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Сканер питается через этот же разъем ? Так как оборудование фирменное - они всегда могут "нестандартить" с разъемами.
     
  10. Дятел

    Дятел Нерд

    СПАСИБО!. Вы правы!! воспользовался вашей идеей про 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й, который, как и весь нижний ряд, конвертор не использует (я так думаю)
     
    Последнее редактирование: 6 апр 2021
  11. Дятел

    Дятел Нерд

    Удалось получить штрих код
    вот в массиве первые 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);
        }
    цифровые коды читает хорошо, а вот те что имеют буквы - с ними проблемы
    "С одним поросенком разобрались" фраза из фильма
     
    Последнее редактирование: 6 апр 2021
  12. parovoZZ

    parovoZZ Гуру

    Всё верно. Символы чисел в ASCII таблице сдвинуты именно на эту величину. Сканер выдаёт числа в виде чисел, а принтер печатает их символы.
     
  13. Дятел

    Дятел Нерд

    спасибо, а как тогда быть с буквами?
    все что нашел по выводу
    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 номером)
     
    Последнее редактирование: 6 апр 2021
  14. parovoZZ

    parovoZZ Гуру

    OCT - это же восьмеричное представление. Там выше семёрок нет ничего))) Нафига оно здесь?
     
  15. Дятел

    Дятел Нерд

    спасибо, разобрался уже. поздно голова совсем плохо варит.
    Хотелось бы еще разобраться как и буквы считывать. Пока не надо, но вдруг понадобится. Да и так, для общего развития. любопытно.