DUE - RS485 - Wie sende und empfange ich Daten?

Guten Tag,

ich möchte mit meinem DUE einen A/D-Wandler ansteuern. Über RS485.
[tt][iurl=http://www.soemer.de/messverstaerker/messverstaerker-ldu-68_1.html]A/D-Wandler[/iurl][/tt]
Senden möchte ich zum Beispiel:
Senden: OP1 (mit CR) -> Öffnen Kanal zu Wandler Nr.1
Empfangen: OK
Senden: GW (CR)
Empfangen: N+01234
Ich habe mir bereits einen MAX3485 Transceiver besorgt.
Weiß nun aber nicht weiter.

Hallo,
mit einem Blockschaltbild beginnen, darin die mechanischen und elektrischen Schnittstellen identifizieren und in Konstruktionsmodule überführen.

chrueschiii:
Weiß nun aber nicht weiter.

Wo ist denn dein Problem? HW-Anschluß? Software?

Die Übertragung über RS485 entspricht weitgehend der normalen seriellen Schnittstelle. Da der Due da mehrere hat ist das also kein Problem. Du musst also deinen RS485-Adapter ( ein Link wäre nicht schlecht ) an eine der seriellen Schnittstellen 1..3 anschließen und kannst dann entsprechend mit Serial1..Serial3 deine Daten übertragen.

Ok alles klar.
Hier ist der Link für den Transceiver
https://datasheets.maximintegrated.com/en/ds/MAX3483-MAX3491.pdf

Sprich:
RO --> TX1
DI --> RX1
RE --> ???
DE --> eventuell an digitale Pins? (Es gibt ja auch noch den RTS pin, aber da muss man glaube ich noch irgendwie in einen anderen Modus wechseln oder?)

Also dann ganz normal
Serial1.write(OP1\r)
und
Serial1.read()
Oder ist das zu einfach?

Nicht ganz:

RO --> RX1
DI --> TX1
/RE verbunden mit DE --> freier digitaler Pin, Empfangen = LOW, Senden = HIGH

Wenn Du SoftwareSerial mit Serial1 tauschst, dann ungefähr so: SoftwareSerialRS485Example

Die Kommunikation dann wie bei einer normalen seriellen Schnittstelle.

Der MAX3485 ist für halbduplex-Betrieb ausgelegt, dein AD-Wandler kann vollduplex. Ich nehme mal an, dass man den Wandler auch halbduplex betreiben kann ( müsste in der Beschreibung stehen ). Das ist aber dann bei der Kommunikation zu beachten, da nie beide Seiten gleichzeitig etwas senden dürfen.

Der USART (Serial1 / serial2 / ...) verfügt über den RS485-Modus, um die Steuerung des Leitungstreibers zu ermöglichen. Siehe Seite 801 des Sam3x-Datenblattes

Eine Beispielskizze für die Kommunikation im RS485-Modus zwischen Serial1 (USART0) und Serial2 (USART1). Für diese Beispielskizze benötigen Sie nicht einmal RS485-Transceiver.

/********************************************************************************/
/*                          USART RS485 Mode                                    */
/*                    Hook RX1 to TX2  and RX2 to TX1                           */
/********************************************************************************/

char c = 0;
void setup() {

  Serial.begin(250000);

  Serial1.begin(115200); // Serial1 is for USART0
  Serial2.begin(115200); // Serial2 is for USART1

  USART0->US_MR |= US_MR_USART_MODE_RS485;  //select RS485
  USART0->US_TTGR = US_TTGR_TG(10);           //Select a Timeguard

  USART1->US_MR |= US_MR_USART_MODE_RS485;
  USART0->US_TTGR = US_TTGR_TG(10);

  Serial2.print("Hello");
}


void loop() {
  String s;
  s.reserve(10);
  s = "";

  while (Serial1.available() > 0) {
    c = Serial1.read();
    s += c;

  }
  if (s.length() > 0) {
    Serial.println(s);
    Serial2.print(s);
  }
  delay(1000);
}

Vielen Dank für die Hilfe. Werde ich so ausprobieren.

Der MAX3485 ist für halbduplex-Betrieb ausgelegt, dein AD-Wandler kann vollduplex. Ich nehme mal an, dass man den Wandler auch halbduplex betreiben kann

Ja ein Halb-Duplex ist möglich. Habe dafür RX+ und TX+ verbunden, gleiches für RX- und TX-.

Der USART (Serial1 / serial2 / ...) verfügt über den RS485-Modus, um die Steuerung des Leitungstreibers zu ermöglichen. Siehe Seite 801 des Sam3x-Datenblattes

Ja das habe ich auch schon gesehen. Verstehe das nur leider nicht :smiley:

Habe folgendes Programm geschrieben. Funktioniert nur leider nicht.

#define DERE_Pin 6


void setup() {
  pinMode(DERE_Pin, OUTPUT);
  Serial.begin(9600);
  Serial1.begin(9600);
  digitalWrite(DERE_Pin, HIGH);
  Serial1.write("OP\r");
  Serial.print("Sende: OP1");
  digitalWrite(DERE_Pin,LOW);
  if (Serial1.available()){
    Serial.print("LDU verfügbar");
    Serial.write(Serial1.read());
  }
  

}

void loop() {
  if (Serial.available()){
digitalWrite(DERE_Pin, HIGH);
Serial1.write(Serial.read());
digitalWrite(DERE_Pin,LOW);
}
  if (Serial1.available()){
Serial.write(Serial1.read());
  }
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.