RS232-Kommunikationsproblem

Hallo,

ich würde einen Arduino Uno gerne dazu bringen, einen Befehl beim drücken eines Tasters, welcher sich an Eingang 2 befindet über einen MAX232 auszugeben.

Der MAX232 (als Shield ausgeführt) hängt an den Anschlüssen 0 und 1.

Is so Einer: http://images.villageorigin.com/003602-008/001.jpg%3Fs%3D300

Folgender Sketch führt dazu, dass beim Drücken des Tasters im seriellen Monitor der Arduino-Software "RTE 1" angezeigt wird.

Schließe ich den Arduino an ein USB-Netzteil an, leuchtet die TX-LED auf dem Board beim drücken des Tasters nicht und es wird scheinbar somit kein Befehl gesandt. Auch beim Anschluss von 12V ist dies der Fall.

In sämtlichen Fällen reagiert das angeschlossene Gerät nicht auf den gesandten Befehl. Im Anhang ein Ausschnitt aus der Bedienungsanleitung.

Somit bestehen also zwei Probleme:

1. Arduino sendet keine Befehle, wenn nicht an Computer angeschlossen.
2. Gerät reagiert in keinem Fall.

Hat mir jmd. u.U. Tipps?

Gruß Chris

/*                    Testsketch mit Taster über 100 Ohm an Anschluss 2.
 *                    10 kOhm Widerstand an Masse.
 *                    5V Speisung hart am Schalter.
 */                    

#include <Bounce.h>                                          // Bouncing-Library hinzugefügt

int Knopf_1 = 2;                                             // Knopf_1 ist am Anschluss 2
int Knopf_2 = 3;
int Knopf_3 = 4;
int Knopf_SDI = 5;
int Knopf_Logo = 6;
int LED_1 = 8;                                               // Eine LED hängt am Anschluss 8
int val_1;                                                   // Bouncerrückgabewert für Input1
int Knopf_1_State;

Bounce Knopf_1_Bouncer = Bounce( Knopf_1,5);                 // 5 ms Bouncing für Knopf_1

void setup()
{
pinMode(Knopf_1,INPUT);                                      // Anschluss 2 soll ein Eingang sein.
pinMode(LED_1,OUTPUT);                                       // Anschluss 8 soll ein Ausgang sein.
Serial.begin(38400);                                         // Serieller Anschluss mit 38400bps aktivieren.
}

void loop()
{
  Knopf_1_Bouncer.update ( );                                // Abfrage des "Knopf_1_Bouncer"-Wertes.
  val_1 = Knopf_1_Bouncer.read();                            // Bouncerrückgabewert für Knopf_1 wird in "val_1" gespeichert

  if (val_1 != Knopf_1_State)                                // Nur dann (<-!), wenn sich der eingelesene Bouncerrückgabewert (also "val_1") gegenüber "Knopf_1_State" geändert hat.. 
  {                          
    if (val_1 == HIGH)                                       // ..und dieser nun "HIGH" ist..
    {
      Serial.flush();                                        // Seriellen Empfangspuffer leeren
      Serial.println("RTE 1");                               // ..soll den Image aufgrund des Befehls "RTE 1"auf Eingang 1 schalten.
      }
    }
Knopf_1_State = val_1;                                       // speichern des neuen Zustands in "val_1"

}

http://arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf zeigt, dass die TX LED nicht am Arduino sondern am 16U2 hängt.
Leuchtet also nur bei Serial über USB (z.B. SerialMonitor).
Oder hat dein RS232 Modul auch LEDs ? Kann ich auf dem Bild nicht so genau erkennen.

Aber die LED auf dem Uno Pin13 kannst du zu Testzwecken doch selbst steuern ...

int LED_1 = 13;                                               // Eine LED hängt am Anschluss 13 beim UNO
...

  if (val_1 != Knopf_1_State)                                // Nur dann (<-!), wenn sich der eingelesene Bouncerrückgabewert (also "val_1") gegenüber "Knopf_1_State" geändert hat.. 
  {               
     if (val_1 == HIGH)                                       // ..und dieser nun "HIGH" ist..
     {
       // Serial.flush();                                        // War "Seriellen Empfangspuffer leeren"  vor Version 1.0  (man muss sie einfach gern haben)
       Serial.println("RTE 1");                            // ..soll den Image Pro HD aufgrund des Befehls "RTE 1"auf Eingang 1 schalten.
       digitalWrite(LED_1, HIGH);   // LED_1 an beweist, dass das Kommando an Serial gesendet wurde 
     }
    else
      digitalWrite(LED_1, LOW);   // Taster losgelassen
  Knopf_1_State = val_1;
  }
...

Hallo,

mein MAX232-Adapter hat leider keine "Status-LED", ich habe aber 0 und 1 am Arduino immer wieder umgesteckt um ein "falsches Anstecken" auszuschließen.

Hilft mir aber alles sehr viel weiter, was Du geschrieben hast und ich muss das nun erst "setzen lassen". :wink:

Eine Frage hätte ich zunächst noch:

Reicht es theoretisch RX, TX, GND und VCC am MAX232-Adapter anzuschließen, oder muss ich auch CTS und RTS "irgendwo" anschließen, wenn das zu steuernede Gerät standardmäßig auf "Handshake" steht?

Gruß Chris

Hallo,

nachdem ich nun weiter mit der Thematik beschäftigt habe, konnte ich folgenden Versuch positiv abschließen:

Arduino sendet an Port 1 (TX) TTL an MAX232.
Dieser ändert den Spannungspegel auf (9V) und gibt ihn am Sub-D-Anschluss aus.
Über eine Brücke zwischen Pin 2 und 3 gelangt das Signal am Sub-D-Anschluss wieder zum MAX232.
Dieser wandelt wieder auf TTL-Pegel.

Schließlich bekommt der Arduino das Signal am Port 0 (RX) wieder und bestätigt mir dies über eine LED per digitalWrite.

Nun zu meiner Frage:

Muss ich mich eingehend mit ASCII-Tabellen, CTS, Lötbrücken im Sub-D-Stecker usw. beschäftigen, oder geht mein Ansatz aus dem Eröffnungsposting in die richtige Richtung?

Gruß Chris

Nein, normalerweise reichen TX, RX und GND wenn Du das ganze an z.B. ein Terminalprogramm schicken willst. Und da Dein loopback-Test funktioniert, bist Du ja auf dem richtigen Weg.
Der 9V-Pegel ist evtl. etwas niedrig für RS232 - hast Du überall die richtigen Kondensatoren am MAX232 angeschlossen?

markbee:
Nein, normalerweise reichen TX, RX und GND wenn Du das ganze an z.B. ein Terminalprogramm schicken willst. Und da Dein loopback-Test funktioniert, bist Du ja auf dem richtigen Weg.
Der 9V-Pegel ist evtl. etwas niedrig für RS232 - hast Du überall die richtigen Kondensatoren am MAX232 angeschlossen?

9V Signalpegel ist in der Spezifiation der RS232 (H von -3V bis -25V; L von 3V bis 25V)
Grüße Uwe

Hallo,

mittlerweile bin ich der Meinung mein Problem mit einem RS232-Nullmodem_mit_Loopback_Handshake-Kabel lösen zu können.

Um den morgen anstehenden Testablauf sinnvoll umsetzen zu können, benötige ich nun eine Funktion, die folgendes "kann":

"Gib die im seriellen Eingangspuffer sich befindenden Daten seriell aus."

Ich benötige also etwas, das ich in Serial.print(XXX) eintragen kann, um mir den Inhalt des seriellen Eingangspuffers anzeigen lassen zu können.

Gruß Chris