Подключение штрих сканера Honeywell MS9520

Тема в разделе "Arduino & Shields", создана пользователем tpolimer, 27 дек 2018.

  1. tpolimer

    tpolimer Нерд

    Приветствую.
    Подскажите, пожалуйста, в какой стороне искать проблему.

    Используется
    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)
    [​IMG]
    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);
      }
    }
    В мониторе порта тишина, хоть бы мусор какой-нибудь прислал.

    Возможно глаз замылился.
    Как я понимаю, нужно идти по шагам, убедиться, что сам сканер шлет хоть какие-то данные и т.д.
     
  2. tpolimer

    tpolimer Нерд

    После продолжительных праздников, добрался до своей задачи. Проблема подключения решена, все оказалось очень просто.

    Взял переходник 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());
      }
    }
    и все заработало.

    Теперь можно заняться самой программой.
     
    KindMan и arkadyf нравится это.
  3. KindMan

    KindMan Гуру

    Вот видите, по шагам, как всё прекрасно получается. А какой ответ, кроме как "проверьте соединения" вы расчитывали тут услышать? Шанс того, что найдете второго такого человека, с такими же устройствами, крайне мал.
    А если бы задали вопрос так "Не работает считыватель штрих-кода с ардуино, памагите!" то могли бы расчитывать на кучу разных откликов;)
    Удачи в работе!
     
  4. tpolimer

    tpolimer Нерд

    Когда создавал тему не был уверен в модуле, в электронике делаю первые шаги. Думал, мне сразу укажут на не правильный выбор модуля RS232 to TTL.

    Спасибо.
     
  5. tpolimer

    tpolimer Нерд

    С получением и форматом данных разобрался.

    По считывателю просто тонна документации, но быстро найти описания формата данных не удалось. Скачал программу 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.

    Если я правильно понял, можно настраивать пакет данных, но проверить сейчас не могу, нет принтера, чтобы распечатать штрих код настроек. Сканер программируется с помощью штрих кодов, а с экрана он их не читает, только с бумаги.
     
  6. tpolimer

    tpolimer Нерд

    Подсчет контрольной цифры, для 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 все.
     
  7. Дятел

    Дятел Нерд

    А вот у меня не работает.
    У меня Ардуино УНО использую программный 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 ардуино уно
    Подскажите кто можете! (мы люди не местные) :)

    Не могу понять, почему в порт компьютера ничего не выводит, когда там что то есть, маркер то мой выводит. хоть кроказябы какие-то вывел