Arduino Mega 2560: Serial1 bis Serial 3 getötet?

Hallo,

durch einen Verdrahtungsfehler habe ich vermutlich 7V Spannung an den Pins 18 und 19 (Serial1) bekommen (oder auch nur an einem davon).

Nach dem die seriellen Kommunikation mit Serial1 seit dem nicht mehr funktioniert, möchte ich kurz nachfragen, ob sie wirklich defekt ist, wenn

  1. die serielle Kommunikation über USB noch klappt und

  2. die serielle Kommunikation über Pin 18 und 19 via SoftwareSerial noch klappt?

Wenn das so ist, vermute ich, dass es für die serielle Kommunikation über USB und über Serial1 bis 3 zwei getrennte Bausteine gibt. Kann man den Baustein für die Serial1 bis3 tauschen? Falls ja, wo finde ich das Teil?

Welchen Nachteil habe ich, wenn ich nun an den Pins 18 und 19 mit der SoftwareSerial arbeite?

Danke fürs Lesen und Antworten!

Gruß
Peter

Der Controller hat 4 USARTs, von denen einer für USB verwendet wird und die anderen 3 auf die Pins von Serial 1 - 3 laufen. Da es sich bei jeder Schnittstelle um einen eigenes, unabhängiges Modul im Chip handelt, wirst du vermutlich nur Serial1 gekillt haben.
SoftwareSerial spricht die Ports direkt im Programm an und umgeht so das USART-Modul (macht man ja oft wenn alle verbaut sind). Klappt SoftwareSerial, so ist der I/O-Port noch intakt (d. h. digitalRead/Write geht noch), aber der echte USART geht nicht mehr.
SoftwareSerial hat den Nachteil, dass es:

  • ... mehr Speicher benötigt (RAM und v. A. Flash, wegen der Bibliothek), sollte aber beim Mega kein Problem sein
  • ... langsamer beim Lesen und Schreiben ist, da die Serielle Schnittstelle im Programm emuliert wird
  • ... Interrupts benötigt, die dein Programm bei Zeitkritischen anwendungen evtl ausbremst
  • ... nur niedrige Baudraten zulässt, um sicher zu funktionieren

Und nein, es ist kein extra Chip verbaut, den du Tauschen kannst, alles ist im Controller drin. Lediglich ein Serial<->USB Konverter ist für Serial0 drauf, den du zum Programmieren und Debuggen benutzt.

Gruß,
Marv

Danke Marv für Deine Antwort.

Habe inzwischen weitere Tests gemacht und nun keinen Plan mehr. Er sendet zwar mit SoftwareSerial über Pin 18, empfängt aber nichts auf Pin 19. Mit "dititalWrite" lässt sich der Pin 19 high schalten, kann also nicht defekt sein.

Habe es jetzt mit den Pins 3 und 4 versucht. Hier das gleiche: Senden geht, empfangen geht nicht. Ich habe noch einen Uno mit dem ich es auch getestet habe. Hier klappt es tadellos. Der gleiche Sketch funktioniert aber mit dem Mega nicht:

#include <SoftwareSerial.h>  

int bluetoothTx = 3;
int bluetoothRx = 4;
int led = 13;
String readString;

SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);

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

void loop(){
  
  while (bluetooth.available()){
    char toSend = (char)bluetooth.read();
    delay(2);
    readString += toSend;
  }

  if (readString.length() > 0) {
    
    if(readString.indexOf('1')){
      digitalWrite(led, HIGH);
    }
    if(readString.indexOf('0')){
      digitalWrite(led, LOW);
    }
    
    Serial.println(readString);
    readString="";
    
  } 
    
  if(Serial.available()){
    bluetooth.print((char)Serial.read());
  }

}

Ist es möglich, dass der Empfang jetzt grundsätzlich defekt ist (außer über die USB-Schnittstelle)?

Du musst beachten: Die USB Schnittstelle ist genauso an einen Serialport angeschlossen wie die Pins von Serial 1 - 3. Ein generelles Empfangen gibt es nicht.
Bezüglich des SoftwareSerial: Ich meinte, damit du Empfangen kannst, musst du einen Pin als RX benutzen, der Interrupts zulässt. Ich hab grad nachgeguckt, das sind beim Mega die Pins 2, 3, 21, 20, 19 und 18. Demnach sollte es eigentlich möglich sein, auf diesen Pins mit SwS zu empfangen. Außer du hast mit deiner Überspannung die Interrupttrigger zerschossen. Klappt denn attachInterrupt() auf Pin 19 noch?
Insgesamt bin ich mit SwS noch nie zufrieden gewesen, das Senden klappt ganz gut, aber mit dem Empfang hatte ich auch Schwierigkeiten. Ich bin dann auf einen Controller mit mehreren Serials ausgewichen oder hab auf die USB-Verbindung verzichtet.

Tun denn noch Serial 2 und 3?

Edit (hat nix mit dem eigentlichen Problem zu tun):
bist du sicher dass if(readString.indexOf('1')) das richtige macht? IndexOf gibt die Postion zurück, wo '1' im String gefunden wurde. Wenn es nicht vorkommt, gibt es -1 zurück. Somit ist die Bedingung wahr, wenn eine '1' nicht als erstes Zeichen steht, da -1 auch als "true" interpretiert wird. Sinnvoller wäre meines Erachtens (kommt ja immer drauf an was du machen willst): if(readString.indexOf('1') != -1)

Ich dachte SoftwareSerial geht an allen Pins die PinChange Interrupts machen? Das sind wesentlich mehr, aber auf dem Mega nicht alle.

Für bessere Zuverlässigkeit gibt es noch AltSoftSerial:
https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html

Braucht allerdings einen Timer und geht dann nur an zwei bestimmten Pins. 46 und 48 auf dem Mega

MGOS:
Klappt denn attachInterrupt() auf Pin 19 noch?

Ja, funktioniert.

MGOS:
Tun denn noch Serial 2 und 3?

Ja, funktionieren beide. Danach habe ich es noch einmal mit meinem kleinen Testprogramm mit Serial1 versucht - und siehe da: es klappt hier auch wieder. Der Mega war jetzt einige Stunden spannungslos. Eventuell eine magische Selbstheilung? (wohl eher nicht). Danach habe ich es noch einmal mit meinem "echten" Programm versucht, das wesentlich umfangreicher ist. Ich vermute jetzt, dass ich bei der ganzen Testerei durch das Hin- und Herstecken der Pins und dem Wechsel der Serials im Programm irgendwann vergessen habe das SerialX.begin(9600) anzupassen und bin dadurch ins Schleudern gekommen. Nun ja, hauptsache, es funktioniert wieder und ich muss nicht noch einmal 50,- Euro berappen.

MGOS:
Ich bin dann auf einen Controller mit mehreren Serials ausgewichen oder hab auf die USB-Verbindung verzichtet.

Das klingt jetzt so, als könnte man eine zusätzliche Platine anschließen, die dann die seriellen Schnittstellen bereitstellt? Das wäre noch interessant für mich, falls doch einmal etwas kaputt wird. Dann könnte man da eventuell günstig nachrüsten, ohne, dass man einen ganz neuen Mega benötigen würde.

MGOS:
bist du sicher dass if(readString.indexOf('1')) das richtige macht?

Ja, nee, das war vorher auf if(readString.indexOf('1') > 0) gestanden und hat dann nicht mehr funktioniert, wenn nur 1 Zeichen übertragen wurde. Daher habe ich das ohne groß zu überlegen geändert. War dann auch nicht mehr wichtig, da die übertragenen Daten zur Kontrolle auf dem seriellen Monitor ausgegeben wurden. Aber dennoch danke fürs Mitdenken!

Serenifly:
Braucht allerdings einen Timer und geht dann nur an zwei bestimmten Pins. 46 und 48 auf dem Mega

Außer den Kommunikationsports ist der Rest voll verplant. Die Softwarevariante wäre auch nur eine Übergangslösung gewesen, bis ich einen neuen Mega bekommen hätte, damit ich meine App in der Zwischenzeit weiter entwickeln kann.

So, bin nun wirklich froh, dass es wieder funktioniert und es weiter gehen kann. Habe damit einen halben Tag verplempert...