Arduino Mega: nur 1 von 4 UARTS (Serial 1-4) funktioniert, warum?

Hallo,

Seit ca. 7 Stunden wühle ich mich bei Google durch, und das Internet ist voll von Berichten über nicht funktionierende Serials des Arduino Mega.

Wenn man nur 1 der 4 mit SerialX.begin(X) initialisiert, funktioniert alles problemlos. Dabei ist es vollkommen egal ob Serial1, Serial3 usw.
Aber wenn man einen 2. versucht zu initialisieren, dann bekommt man mit SerialX.available() immer ein negatives Ergebnis.

Kennt irgendjemand eine Lösung wie man diesen Bug umgehen kann?

Welche "funktionierende" Alternative existiert zu dem defekten Arduino Mega?

PS.: mit dem Arduino DUE scheint das selbe Problem zu existieren, jedenfalls kann ich nur 1 UART gleichzeitig nutzen. Ärgerlich. Da hat man 2 Boards mit 4 Uarts... doch sind genauso limitiert wie ein uralter Arduino Duemilanove :slight_smile:

Mit welchem Sketch und welcher Hardware/Beschaltung hast du das getestet? Das wäre mir neu, dass das nicht funktionieren sollte.

Laut dieser Aussage hat der Mega 2560 4 "hardware serial, Serial1, Serial2 or Serial3 on Arduino mega2560":
http://embeddedcomputing.weebly.com/tutorial-2-playing-with-serial-ports.html

Du kannst ja mal probieren ein Byte an Serial1 zu senden, und mit Brücken jeweils TX/RX der Serial1,Serial2, Serial3 zu überbrücken... und zum Schluss dann von Serial3.TX => Serial.RX Pin, dann im Seriellen Monitor das gesendete Byte anzeigen lassen.

Serial.begin(38400);
Serial1.begin(38400);
Serial2.begin(38400);
Serial3.begin(38400);

Das wird nicht funktionieren... weil bereits schon Serial1 oder Serial2 nicht available() sein wird.

Aber wenn man einen 2. versucht zu initialisieren, dann bekommt man mit SerialX.available() immer ein negatives Ergebnis.

Das glaube ich nicht. Es kann 0 sein, aber negativ? Nach Deiner Beschreibung sollte

void setup() {
  Serial.begin(19200);
  Serial1.begin(19200);
}

void loop() {
  Serial.println(Serial1.available());
}

immer einen negativen Output liefern. Ist das bei Dir wirklich der Fall? Falls ja, welche Version der IDE setzt Du ein?

DreiMalNull:
Aber wenn man einen 2. versucht zu initialisieren, dann bekommt man mit SerialX.available() immer ein negatives Ergebnis.

Hast Du den Code auf http://arduino.cc/en/Tutorial/MultiSerialMega getestet?
Der funktioniert bei Dir auch nicht?

Und dass bei seriellen Geräten die Beschriftung meist so ist, dass der TX-Pin des seriellen Geräts mit dem RX-Pin des Arduino zu verbinden ist und vice versa, hast Du auch berücksichtigt?

Hmmm...

Ich habe das hier mal gemacht:

void setup() {
  // initialize both serial ports:
  Serial.begin(38400);
  Serial1.begin(38400);
  Serial2.begin(38400);
  Serial3.begin(38400);
}

void loop() {
  
  Serial1.write(0x41); 
  
  delay(200);
  
  if (Serial2.available()) {
    int inByte = Serial2.read();
    Serial2.write(inByte); 
  }  
  delay(200);
  
  
  if (Serial3.available()) {
    int inByte = Serial3.read();
    Serial3.write(inByte); 
  }    
  delay(200);
  
  
   if (Serial.available()) {
    int inByte = Serial.read();
    Serial.write(inByte); 
  }    
  
  delay(200);
}

Und Brücken gesteckt TX1->RX2 | TX2->RX3 | TX3->RX0

Funktioniert.

Kann es sein, dass es an meinen gesetzten Interrupts liegt? :

 // * Interrupt *
 TCCR1A = 0;				  
 TCCR1B = (1<<CS10);  
 TIMSK1 = (1<<OCIE1A); 



ISR(TIMER1_CAPT_vect) {          
    
}


ISR(TIMER1_COMPA_vect) {	
       
    long time = micros();           
    
   OCR1A += 5000-time;  
}

hi,

hat mich jetzt schon gewundert, warum das nicht gehen soll, und schnell eine schaltung aufgebaut:
1 Arduino Mega
4 328er

auf dem mega:

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial2.begin(9600);
  Serial3.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  Serial.write(0x00); 
  delay(250);
  Serial.write(0x01); 
  delay(500);
  digitalWrite(13, LOW);
  Serial1.write(0x00); 
  delay(250);
  Serial1.write(0x01); 
  delay(500);
  digitalWrite(13, HIGH);
  Serial2.write(0x00); 
  delay(250);
  Serial2.write(0x01); 
  delay(500);
  digitalWrite(13, LOW);
  Serial3.write(0x00); 
  delay(250);
  Serial3.write(0x01); 
  delay(500); 
}

auf den 328ern:

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {
  if (Serial.available()) {
    char inByte = Serial.read();
    if (inByte == 0x00) {
      digitalWrite(13, HIGH);
    }
    if (inByte == 0x01) {
      digitalWrite(13, LOW);
    }
  }
}

LEDs blinken, wie sie sollen.

gruß stefan

Ich verstehs auch net.

Vielleicht liegts auch an dem Bluetooth Shield (Itead V2.2). Keine Ahnung. Hatte über Probleme mit dem Mega bei Google gelesen und dachte ich hätte das gleiche Problem.

Muss ich alles mal durchtesten.

Ich verstehs auch net.

wiener?