Go Down

Topic: Arduino Mega: nur 1 von 4 UARTS (Serial 1-4) funktioniert, warum? (Read 4800 times) previous topic - next topic

DreiMalNull

Jun 14, 2013, 11:51 am Last Edit: Jun 14, 2013, 12:35 pm by DreiMalNull Reason: 1
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 :)

sth77

Mit welchem Sketch und welcher Hardware/Beschaltung hast du das getestet? Das wäre mir neu, dass das nicht funktionieren sollte.
Mein verwaister Arduino-Blog: http://www.sth77.de/ - letzter Eintrag: Diamex-ISP in der irgendwann mal aktuellen Arduino-IDE 1.6.4

DreiMalNull

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.




pylon

Quote
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

Code: [Select]
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?

jurs


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?

DreiMalNull

Hmmm...

Ich habe das hier mal gemacht:
Code: [Select]
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? :

Code: [Select]

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



ISR(TIMER1_CAPT_vect) {         
   
}


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




Eisebaer

hi,

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

auf dem mega:
Code: [Select]
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:
Code: [Select]
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

DreiMalNull

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.

Eisebaer


Go Up