Go Down

Topic: Problem mit NewSoftSerial mit 2 Serial ports (Read 1 time) previous topic - next topic

Ko

Hey miteinander,
ich hab ein kleineres Problem. Ich würd gern den Arduino auf dem des Touchshield slide sitzt als Gateway zwischen dem Touchshield Slide und einem weiteren Arduino hernehmen. Sprich, dass ich ein Menü auf dem Touchshield hab und am anderen Arduino Sensoren, Bluetooth etc. Funktioniert alles soweit prima bis ich versuch 2 serielle ports abzufragen.

Mein Code aud dem Arduino ist:
Code: [Select]

#include <NewSoftSerial.h>

#define ArduinoSerial_rxpin 9
#define ArduinoSerial_txpin 8
#define Touch_rxPin 3
#define Touch_txPin 2

//variables
int val = -1;

NewSoftSerial ArduinoSerial(ArduinoSerial_rxpin,ArduinoSerial_txpin);
NewSoftSerial touchSerial(Touch_rxPin,Touch_txPin);

  void setup(){
  pinMode(ArduinoSerial_txpin,OUTPUT);
  pinMode(ArduinoSerial_rxpin,INPUT);
  pinMode(Touch_rxPin, INPUT);
  pinMode(Touch_txPin, OUTPUT);
  ArduinoSerial.begin(9600);
  delay(500);
  touchSerial.begin(9600);
  delay(500);
}

  void loop(){
  if (touchSerial.available()) {
           int counter=0;
           char stringIn[32] = "";
           while(touchSerial.available()>0) {
                 val = touchSerial.read();
                 stringIn[counter]=val;
                 counter++;                
           }        
           ArduinoSerial.print(stringIn);
   }
   
 if (ArduinoSerial.available()){
           int counter=0;
           char stringIn[32] = "";
           while(ArduinoSerial.available()>0) {
                 val = ArduinoSerial.read();
                 stringIn[counter]=val;
                 counter++;
           }
          touchSerial.print(stringIn);
   }
 
}


Wenn ich eine if schleife herausnehme (egal welche) funktioniert es in entsprechender Richtung. Hat irgendwer eine Idee woran es liegt oder wie man es besser machen könnte?

Danke im vorraus,
Ko

Webmeister

Code: [Select]
void setup(){
  pinMode(ArduinoSerial_txpin,OUTPUT);
  pinMode(ArduinoSerial_rxpin,INPUT);
  pinMode(Touch_rxPin, INPUT);
  pinMode(Touch_txPin, OUTPUT);
  ....
}

PinMode-Deklaration für serielle Portleitungen ist nicht notwendig.

Ko

tut mir leid wenn ichs sag aber selbst wenn ichs weglass, funktoniert es nicht :(

apogee

So wie ich das lese, kann ja im Moment nur eines der beiden wahr werden oder?

Ko

ja ich will ja nur des Signal/die Daten weitergeben. Oder wie meinst du des?

apogee

Wenn ein IF wahr wird, dann kann ja das andere nicht mehr abgefragt werden.

Willst du jetzt beide zusammen abfragen und das geht nicht, oder willst du nur eins abfragen, und es geht generell nicht?

Ko

ich will beide abfragen. weil ich in beide richtungen ja Daten schicken muss.

mich wundert es nur dass wenn ich anstatt des Touchshields ( also der touchSerial Schnittstelle) die normale vordefinierte Serial schnittstelle hernehm, es funktioniert.

Philipp Maricek

Moin,

lies mal auf der NewSoftSerial Seite nach,
http://arduiniana.org/libraries/newsoftserial/
Hier ein Zitat:
Code: [Select]
Any time you "use" an object by calling its begin(), available(), read(), or print[ln]() methods, it becomes the "active" object, and the previously active object is deactivated and its RX buffer discarded. An important point here is that object.available() always returns 0 unless object is already active. This means that you can't write code like this:

void loop()
{
 if (device1.available() > 0)
 {
   int c = device1.read();
   ...
 }
 if (device2.available() > 0)
 {
   int c = device2.read();
   ...
 }
}

This code will never do anything but activate one device after the other.


Mfg
Philipp

Ko

jo danke, Habs auch bemerkt wie bescheuert ich war. Habs jetz mit nem Interrupt gelöst und funktioniert wunderbar

Go Up