Последовательный порт

Тема в разделе "Arduino & Shields", создана пользователем Сергей777, 21 авг 2018.

  1. Сергей777

    Сергей777 Нерд

    Помогите, пожалуйста!
    Нужно подключить сканер отпечатков пальцев.
    вот код, который позволяет обмениваться данными сканеру с программой SFGDemo
    Код (C++):
    void setup() {
        Serial1.begin(57600);
        Serial.begin(57600);
    }
    void loop(){
      while (Serial.available())
      Serial1.write(Serial.read());
      while (Serial1.available())
      Serial.write(Serial1.read());
    }
    Для работы ардуинки Леонарды со сканером необходим следующий код
    Код (C++):
    SoftwareSerial  mySerial(8, 9); //( RX, TX );
      Adafruit_Fingerprint finger(&mySerial);
    Как только создаю объект SoftwareSerial отрубается Serial1
    Есть ли возможность сохранить и обмен с программой для загрузки изображений по USB через программу SFGDemo и обрабатывать распознавание отпечатка через объект SoftwareSerial?
    Попытался сотворить обмен через 8 и 9 пин, используя объект SoftwareSerial вместо Serial1
    Код (C++):
    void setup() {
        Serial1.begin(57600);
        Serial.begin(57600);
    }
    void loop(){
      while (Serial.available())
      mySerial.write(Serial.read());
      while (mySerial.available())
      Serial.write(mySerial.read());
    }
    Но ардуинка не приняла мою логику.
    У кого есть знания или идеи подскажите.
     
  2. ANV

    ANV Гуру

    Этот код без изменений будет работать на Леонардо, softwareserial не нужен. Сканер подключать к пинам 0 и 1
     
  3. Сергей777

    Сергей777 Нерд

    Прошу прощения за то что не умею формулировать вопросы!
    Код (C++):
    #include <Adafruit_Fingerprint.h>
    #include <SoftwareSerial.h>
    void setup() {
        while(!Serial);                                               // Ожидание инициализации аппаратного UART
      delay(500);                                                   // Ожидание инициализации модуля отпечатков пальцев
      Serial.begin(9600);                                           // Инициализация аппаратного UART на скорости 9600
     
      Serial1.begin(57600);
      Serial.begin(57600);
     
      pinMode(A0, INPUT);                                           // Регистрация нажатия на сенсор
      pinMode(10, OUTPUT);                                          // Управление питанием сканера
      pinMode(4, INPUT);                                            // Кнопка переключения режимов записи и чтения
     
    if(digitalRead(4)){

        digitalWrite(10, HIGH);
        while(1){
          while (Serial.available()) Serial1.write(Serial.read());
          while (Serial1.available()) Serial.write(Serial1.read());
        }
      }
      else{  
        readMyFinger();  
      }
    }
    void loop(){}

    void readMyFinger(){ ///работает
      SoftwareSerial  mySerial(8, 9); //ИМЯ_ОБЪЕКТА( RX, TX );
      Adafruit_Fingerprint finger(&mySerial);
      finger.begin(57600);  
      while(1){
        if(analogRead(A0)<300){
          digitalWrite(10, HIGH);
          delay(500);
          if(finger.getImage()         == FINGERPRINT_OK){              // Захватываем изображение, если результат выполнения равен константе FINGERPRINT_OK (корректная загрузка изображения), то проходим дальше
            Serial.println("Image7");
            if(finger.image2Tz()         == FINGERPRINT_OK){              // Конвертируем полученное изображение, если результат выполнения равен константе FINGERPRINT_OK (изображение сконвертировано), то проходим дальше
              if(finger.fingerFastSearch() == FINGERPRINT_OK){              // Находим соответствие в базе данных отпечатков пальцев, если результат выполнения равен константе FINGERPRINT_OK (найдено соответствие), то проходим дальше
                Serial.print("Found ID=");
                Serial.print(finger.fingerID);
                Serial.print(", with confidence of ");
                Serial.println(finger.confidence);
               
               }
             }
           }
          delay(500);
        }
        digitalWrite(10, LOW);
        delay(500);
      }
    }
     
    Две части кода, одна работает для связи с SFGDemo, через нее реально нагляднее загружать изображения, а вторая часть кода обрабатывает переданное на сканер изображение после прикладывания пальца. Переключение режимов по нажатию кнопки.
    Вопрос если я втыкаю одновременно в TX сканера в D0 и D8, а его RX в D1 и D9 не работает ничего, по всей видимости Serial1 и не дает работать mySerial. Можно ли поправить? И стоит ли?
     
  4. ANV

    ANV Гуру

    А почему все в setup()?
     
  5. Сергей777

    Сергей777 Нерд

    Ну там не все в setup()
    Логика такая, что при подаче питания на ардуинку, она выбирает в каком режиме работать.
    В setup() лишь выбирается какой из циклов запустится, цикл опроса Serial1 или mySerial.
    Не могу придумать как объединить эти два объекта,
    я втыкаю одновременно в TX сканера в D0 и D8, а его RX в D1 и D9, тут видимо конфликт возникает
    когда передача приходит на D0 она автоматом отрубает D8 :((((, та же хрень с приемом.
    Мысль приходит только одна переключать пины физически, релешкой например, но это какое-то не эстетическое решение. Моих знаний не хватает, очень прошу помощи
     
    Последнее редактирование: 22 авг 2018
  6. ANV

    ANV Гуру

    Не надо никакого одновременного втыкания в D0 и D8 и softserial тоже
    В функции readmyfinger инициализируйте с serial1 и все
     
    Сергей777 нравится это.
  7. Сергей777

    Сергей777 Нерд

    ANV, правильно ли я понял что необходима следующая запись Adafruit_Fingerprint finger(&Serial1);
    вместо Adafruit_Fingerprint finger(&mySerial); ????
     
  8. Сергей777

    Сергей777 Нерд

    ANV, вы великий человек! Спасибо огромное!