• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Multiple SoftwareSerial (3szt) problem
#1
Witam,

Mam problem z użyciem SoftwareSerial.
Używam Arduino Pro Mini (Atmega 328P, 3.3V)

Do arduino mam podpięte 3 inne układy wysyłające dane po serialu:

1. Odtwarzacz mp3 (DFPlayer)                               SoftwareSerial #1  pin(3,4)      PORTD
2. Układ radiowy (HC-11)                                       SoftwareSerial #2  pin(14,15)  PORTC
3. Klawiaturę (3 przyciski + 2 potencjometry)         SoftwareSerial #2  pin(9,8)      PORTB

(dodatkowo sprzętowy uart wykorzystuję do monitorowania czy wszystko działa jak bym chciał).

Program, który próbuje napisać powinien ciągle "nasłuchiwać",
czy coś nie przyszło z układu radiowego lub klawiatury
i jeśli coś jest, to wyślij komendę do mp3.

Każdy z 3 układów w pojedynkę działa (mp3 gra, klawiatura wysyła co ma wysyłać, układ radiowy działa ok)- każdy z SoftwareSeriali pojedynczo działa OK. Ale razem nie działają (muszę nacisnąć ...10razy klawiaturę żeby coś się odebrało).


Spodziewałbym się, że poniższy kod będzie działał następująco (główna pętla):
nasłuchuj na pierwszym porcie, jeżeli coś jest to coś zrób, jak nie ma, to nasłuchuj na drugim itd...

Czy jest szansa zmodyfikować ten program tak, żeby działał jak chcę?


Kod:
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

String inputString = "";
DFRobotDFPlayerMini myDFPlayer;

SoftwareSerial mySoftwareSerial_DF(3, 4); // 3RX, 4TX         //DFPlayer
SoftwareSerial mySoftwareSerial_KEY(9, 8); // 9RX, 8TX        //KEYBOARD + Knoobs
SoftwareSerial mySoftwareSerial_RADIO(15, 14); // 15RX, 14TX  //RADIO


void setup(void)
{

 Serial.begin(9600);

   //inicializowanie odtwarzacza mp3 DFPlayer
   mySoftwareSerial_DF.begin(9600);
   if (!myDFPlayer.begin(mySoftwareSerial_DF)) {  
   Serial.println(F("DF Error"));
   while(true);
   }
 Serial.println(F("DF OK"));

 mySoftwareSerial_RADIO.begin(9600);
 mySoftwareSerial_KEY.begin(9600);

}

void loop(void)
{
  mySoftwareSerial_KEY.listen();
  //delay(1);
  if (mySoftwareSerial_KEY.available()) {
  char inChar = (char)mySoftwareSerial_KEY.read();
  inputString += inChar;
  Serial.println(inputString);
  }

  mySoftwareSerial_RADIO.listen();
  //delay(1);
  if (mySoftwareSerial_RADIO.available()) {
  char inChar = (char)mySoftwareSerial_RADIO.read();
  inputString += inChar;
  Serial.println(inputString);
  }
 
     
}



Z góry dziękuję za zainteresowanie i pomoc.
mm
 
Odpowiedź
#2
W danym momencie może odbierać tylko jeden "port". Spełniasz ten warunek?
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#3
(14-02-2017, 22:31)namok napisał(a): W danym momencie może odbierać tylko jeden "port". Spełniasz ten warunek?

tak jak napisałem,

Spodziewałbym się, że poniższy kod będzie działał następująco (główna pętla):

nasłuchuj na pierwszym porcie, jeżeli coś jest to coś zrób, jak nie ma, to nasłuchuj na drugim itd...
 
Odpowiedź
#4
Jeśli zaczniesz nasłuchiwać na porcie nim zaczną przychodzić dane i pozostaniesz na nim do zakończenia transmisji to będzie ok.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#5
Przedstawię to w uproszczony sposób:
Atmega328 ma tylko 1 sprzętowy serial, dwa kolejne są wirtualne.
Sprzętowy serial działa zawsze w tle, wirtualny to zwyczajny program który się wykonuje w danej chwili.
Więc nie uzyskasz tego co się spodziewasz na tym procku.

Sprubuj tak
Odtwarzacz mp3 (DFPlayer) SoftwareSerial
Układ radiowy (HC-11) Serial
Klawiaturę (3 przyciski + 2 potencjometry) SoftwareSerial

Zrezygnuj z nasłuchiwania jednego z portów (Odtwarzacz mp3 (DFPlayer) ), będzie wykorzystywany jedynie do wysyłania komend do otwarzacza.
W takiej konfiguracji twoje szanse drastycznie rosną .
Na programowaniu to się nie znam, ale w elektronice mogę pomóc 
 
Odpowiedź
#6
(16-02-2017, 11:36)ESPERAL napisał(a): Przedstawię to w uproszczony sposób:
Atmega328 ma tylko 1 sprzętowy serial, dwa kolejne są wirtualne.
Sprzętowy serial działa zawsze w tle, wirtualny to zwyczajny program który się wykonuje w danej chwili.
Więc nie uzyskasz tego co się spodziewasz na tym procku.

Sprubuj tak
Odtwarzacz mp3 (DFPlayer)                               SoftwareSerial
Układ radiowy (HC-11)                                        Serial
Klawiaturę (3 przyciski + 2 potencjometry)         SoftwareSerial

Zrezygnuj z nasłuchiwania jednego z portów (Odtwarzacz mp3 (DFPlayer) ), będzie wykorzystywany jedynie do wysyłania komend do otwarzacza.
W takiej konfiguracji twoje szanse drastycznie rosną .


ESPERIAL:

tak właśnie zamierzam zrobić, jeżeli nie pojawi się jakieś inne rozwiązanie.
Myślałem, że można to jakoś obejść.
 
Odpowiedź
#7
(16-02-2017, 12:21)shamrock napisał(a): tak właśnie zamierzam zrobić, jeżeli nie pojawi się jakieś inne rozwiązanie.
Myślałem, że można to jakoś obejść.

Grzechem pierworodnym jest używanie takiej komunikacji do takich zastosowań.
Do rozproszonego zarządzania służy I2C. (lokalnie w zasięgu jednej obudowy)
Serial służy do komunikacji punkt-punkt (komunikacja urządzenie-urządzenie)

Zagwozdka stawiana przez ciebie jest możliwa do rozwiązania na wiele sposobów:
- zmienić procek na posiadający kilka seriali
- użyć kilka procków (każdy by obsługiwał jeden serial - a procki komunikowały by się miedzy sobą po spi)
- Jeżeli poszczególne elementy są z dala od siebie można użyć ESP8266 (bez atmeg)
  urządzenia poszczególne miały by wystawione porty po sieci, a zarządca mógłby kolejkować zdarzenia.
Na programowaniu to się nie znam, ale w elektronice mogę pomóc 
 
Odpowiedź
#8
Jak już koniecznie ma być po uart to słowo klucz brzmi multiplexer , np. jak poniżej .

https://www.maximintegrated.com/en/app-n...mvp/id/588
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#9
(16-02-2017, 15:46)JasQ napisał(a): Jak już koniecznie ma być po uart to słowo klucz brzmi multiplexer , np. jak poniżej .

https://www.maximintegrated.com/en/app-n...mvp/id/588

Takie rozwiązanie ma sens w sytuacji gdy to arduino inicjuje komunikację. Tutaj mamy sytuację odwrotną: arduino czeka na informacje z innych urządzeń i nie wie kiedy ta informacja przyjdzie.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości