RS485 communication Arduino Mega

Hallo,
Ich habe zum testen der RS485 zu TTL - Bausteine ein Programm geschrieben.
Als Vorlage für die Verkabelung und dem Programm habe ich diesen Eintrag hergenommen: https://arduino-info.wikispaces.com/SoftwareSerialRS485Example

Da ich eine Arduino Mega besitze habe ich die SoftwareSerial.h Bibliothek nicht benötigt sondern habe einfach mit Serial1 gearbeitet.

Leider funktioniert es nicht. Wenn ich im Serial-Monitor eine Zahl eingebe blinkt beim zweiten Arduino zwar die LED 13 aber es kommt nichts mehr zurück.

Hier der Master Arduino Code:

#define SSerialTxControl 40   //RS485 Direction control

#define RS485Transmit    HIGH
#define RS485Receive     LOW

#define Pin13LED         13


int byteReceived;
int byteSend;

void setup()  
{
 
  Serial.begin(9600);
  Serial.println("YourDuino.com SoftwareSerial remote loop example");
  Serial.println("Use Serial Monitor, type in upper window, ENTER");
  
  pinMode(Pin13LED, OUTPUT);   
  pinMode(SSerialTxControl, OUTPUT);    
  
  digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver   
  
 
  Serial1.begin(4800);   // set the data rate 

}//--(end setup )---


void loop()  
{
  digitalWrite(Pin13LED, HIGH);  // Show activity
  if (Serial.available()>0)
  {
    byteReceived = Serial.read();
    
    digitalWrite(SSerialTxControl, HIGH);  // Enable RS485 Transmit   
    Serial1.write(byteReceived);          // Send byte to Remote Arduino
    
    digitalWrite(Pin13LED, LOW);  // Show activity    
    delay(10);
    digitalWrite(SSerialTxControl, LOW);  // Disable RS485 Transmit       
  }
  
  if (Serial1.available()>0)  //Look for data from other Arduino
   {
    digitalWrite(Pin13LED, HIGH);  // Show activity
    delay(100);
    byteReceived = Serial1.read();    // Read received byte
    Serial.println(byteReceived);        // Show on Serial Monitor
    delay(10);
    digitalWrite(Pin13LED, LOW);  // Show activity   
   }  

}//--(end main loop )---

/*-----( Declare User-written Functions )-----*/

//NONE
//*********( THE END )***********

Und hier vom Slave-Arduino:

/* YourDuino SoftwareSerialExample1Remote
   - Used with YD_SoftwareSerialExampleRS485_1 on another Arduino
   - Remote: Receive data, loop it back...
   - Connect this unit Pins 10, 11, Gnd
   - To other unit Pins 11,10, Gnd  (Cross over)
   - Pin 3 used for RS485 direction control   
   - Pin 13 LED blinks when data is received  
   
   Questions: terry@yourduino.com 
*/

/*-----( Import needed libraries )-----*/

/*-----( Declare Constants and Pin Numbers )-----*/

#define SSerialTxControl 40   //RS485 Direction control
#define RS485Transmit    HIGH
#define RS485Receive     LOW

#define Pin13LED         13

/*-----( Declare objects )-----*/


/*-----( Declare Variables )-----*/
int byteReceived;
int byteSend;

void setup()   /****** SETUP: RUNS ONCE ******/
{
  // Start the built-in serial port, probably to Serial Monitor
  Serial.begin(9600);
  Serial.println("SerialRemote");  // Can be ignored
  
  pinMode(Pin13LED, OUTPUT);   
  pinMode(SSerialTxControl, OUTPUT);  
  
  digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver
  
  // Start the software serial port, to another device
  Serial1.begin(4800);   // set the data rate 
}//--(end setup )---


void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
  //Copy input data to output  
  if (Serial1.available()>0) 
  {
    byteSend = Serial1.read();   // Read the byte 
    
    digitalWrite(Pin13LED, HIGH);  // Show activity
    delay(10);              
    digitalWrite(Pin13LED, LOW);   
    
    digitalWrite(SSerialTxControl, HIGH);  // Enable RS485 Transmit
    
    Serial1.write(byteSend); // Send the byte back
    delay(10);  
    digitalWrite(SSerialTxControl, LOW);  // Disable RS485 Transmit      
    //delay(100);
  }// End If RS485SerialAvailable
  
}//--(end main loop )---

/*-----( Declare User-written Functions )-----*/
//NONE

//*********( THE END )***********

Bitte um Hilfe
LG. nitzi_1

Fotos vom Aufbau ?

Stefan

Vor dem Umschalten auf Empfang sollte ein Serial1.flush() kommen. Und das delay() rauswerfen, das nützt garnichts.

hi,

delay(10);
digitalWrite(SSerialTxControl, LOW);  // Disable RS485 Transmit

dieses delay muß allerdings drinbleiben, sonst tut's nicht...

gruß stefan

Anstatt des delays kannst du auch Serial.flush(); nutzen der wartet dann auch nur so lange nis der Puffer leer ist und nicht länger.
Gruß
DerDani

hi,

stimmt, inzwischen geht das, früher halt noch nicht. deshalb ist in vielen beispielcodes das delay.

gruß stefan