RS485 Projekt Master Slave - Datensätze gehen verloren

Hallo Leute,

ich möchte gerne meine Sensordaten an meinen Laptop (USB Computer <>RS485 Master <> Slaves) übertragen.

Der Master ruft in einer Schleife die einzelnen Sensordaten von mehreren Slaves (A-Z) ab und
überträgt sie auf den seriellen Bus an meinen Laptop.

Leider habe ich zwischen den einzelnen Abfragen im wieder Übtertragungsfehler.
(Ohne RS485 - Crossover RX/TX TX/RX keine Probleme)

Die Sketche habe ich als Anhang. Wäre über jede Hilfestellung bzw. Tipps dankbar.

Hardware: Arduino Uno R3 mit RS485 Expansionshield

RS485 Projekt.rar (2.97 KB)

hi,

vielleicht hilft das weiter:

http://forum.arduino.cc/index.php?topic=206317.0

gruß stefan

hi,

falls Du hardware-serial benutzt (kann hier Deinen sketch nicht lesen), schau bei dem link unter "Flushing the output". vielleicht ist das der fehler...

gruß stefan

serial.flush hat er drin.

Was mich nur wundert. funktionierts bei dem Shield auch mit anderen Pins?
Laut dem Datenblatt braucht man da Pin0 und Pin1, hatte bei mir auch immer funktioniert.

Verwende nie SoftwareSerial, wenn Du irgendwelche zeitkritische Kompontenten sonst noch einsetzt (bei Dir z.B. OneWire). SoftwareSerial deaktiviert alle Interrupts während des Sendens und des Empfangs, was für solche Anwendungen der Tod sein kann. Wenn Du eine serielle Verbindung zum Computer für's Debugging haben musst, verwende einen Leonardo, der hat beides oder gleich einen Mega, der hat 4 Hardware-Serials.

Beim Mega funktioniert nur Serial0 für rs485
Die anderen hab ich nicht zum laufen bekommen.

hi,

serial.flush hat er drin.

das problem hat nichts mit serial zu tun, sondern mit dem ENABLE_PIN vom MAX485.

A small "gotcha" caught me when testing with hardware serial. The following code didn't work properly:

digitalWrite (ENABLE_PIN, HIGH); // enable sending
sendMsg (fWrite, msg, sizeof msg);
digitalWrite (ENABLE_PIN, LOW); // disable sending

Whilst it worked fine with software serial, the code above "turns off" the RS485 chip too quickly, because the last byte is still being sent from the serial hardware port.

A couple of solutions worked:

digitalWrite (ENABLE_PIN, HIGH); // enable sending
sendMsg (fWrite, msg, sizeof msg);
delayMicroseconds (660);
digitalWrite (ENABLE_PIN, LOW); // disable sending

gruß stefan

Es handelt sich um dieses Shield. Die grünen Jumper kann man entfernen. RX,TX,EN kann ich auf einen x-beliebigen Pin legen (Master 11,12,13) (Slave 2,16,17)

Die serielle Verbindung ist nur für den Master (der liest keine Sensoren). Er muss sich nur um die fertigen Datensätze von den Slaves kümmern.

Das heißt mit SoftwareSerial klappt das nicht?

So sieht mein Output aus:

Id=2Cur=230Vol=220Boi=0.00Max=0.00Wat=0AC=0. :slight_smile:
=72Boi=0.00Max=0.00Wat=0AC=0. :0
HUrjrE :0
5rjOCur=67Vol=116Boi=0.00Max=0.00Wat=0AC=0. :roll_eyes:
YrjrE =(
5rjBoi=0.00Max=0.00Wat=0AC=0. :0
rjrE =(
5rj0Vol=78Boi=0.00Max=0.00Wat=0AC=0. :0

Habe das Timing verändert.
Jetzt habe ich keine Fehler mehr, aber leider schluckt er mir ab und zu die ersten Daten in der Zeile.

//Request The Query Using The Slave ID
digitalWrite(EN, TR);
delay(100);
RS485.print(id);
RS485.print('?');
delay(10);
digitalWrite(EN, RE);
delay(100);
data = RS485.read();

Ausgabe:

Cur=2Vol=202Boi=0.00Max=521768.87Wat=1AC=1.
Id=2Cur=18Vol=17Boi=0.00Max=525864.87Wat=0AC=0.
Vol=115Boi=0.00Max=533544.87Wat=0AC=0.
Id=2Cur=190Vol=46Boi=0.00Max=538664.87Wat=0AC=1.
Vol=150Boi=0.00Max=544808.87Wat=1AC=1.
Id=2Cur=196Vol=6Boi=0.00Max=549928.87Wat=1AC=1.
Vol=197Boi=0.00Max=556072.87Wat=0AC=0.

Hallo,

muss ich den RS485 Bus über eine längere Leitung (400m)mit einer externen Spannung versorgen, da der Arduino das nicht mehr schafft?
Ich füge dazu ein Beispielbild ein.

Naja, bei meinem Test mit 100m lief alles. Die schlauen Leute sagen je länger die Leitung desto mehr geht verloren.

Also die "Spannungsversorgung" hast du ja mit den Widerständen in deiner Zeichnung am Ende gemacht.
Da du ja nicht mit einem Ausgang den Wandler versorgst.
evtl wäre anzudenken extern über ein 5V Netzteil nachzudenken das du direkt auf die 5V vom Arduino klemmst um nicht über USB zu Versorgung oder den Linearregler (Versorgung über DC Plug) auf dem Arduino nutzten musst.
Die RS485 Wandler sind dazu konzipiert um längen bis 1000m.
Es steht und fällt alles mit der Qualität der Leitung. und vor allem keine Stern Stiche(bei deriner Leitung bei <20m hat man da eher keine Probleme) es muss so verkabelt werden wie in deiner Skizze.
Gruß
DEr Dani

Problem gelöst (danke für die vielen Tipps und Anregungen) - war zum grössten Teil ein Timing Problem.

In dem nachfolgenden Link steht, dass nicht jeder Pin für RX (Softwareserial) geeignet ist.

http://arduino.cc/de/Reference/SoftwareSerial#.Uw_iWYUpa-8

Ich habe einen UNO R3 - SoftwareSerial derzeit RX über Pin 0 laufen. Gibt es da Erfahrungswerte?

Vielen Dank!

hi,

Du hast also eine softserial über die hardware-serial-pins laufen?

clevere lösung...

gruß stefan

Ich habe einen UNO R3 - SoftwareSerial derzeit RX über Pin 0 laufen. Gibt es da Erfahrungswerte?

Interessant, dann sind die Sketche, die Du hochgeladen hast, von einem anderen Projekt? Dort hast Du am Master 12 und 13 verwendet, am Slave A3 und A4. Das finde ich sehr spannend, denn im gleichen Sketch verwendest Du auch den I2C Bus, welcher aber auf einem UNO (welchen Du nach eigener Aussage verwendest) auf A4 und A5 verbindet. Entweder stimmen Deine Angaben in den Posts nicht oder wir haben das Problem gefunden (Doppelverwendung von A4).

Meine Frage bezog sich auf die Verwendung von RX (Software Serial) ob es da Beschränkungen gibt? Ich bin verschiedene Konfigurationen durchgegangen, deswegen die vermeintliche Doppelbelegung, die aber nicht vorliegt.

Informationen bzgl. RX wären interessant.

Das einfache SoftwareSerial geht an allen Pins die PinChange Interrupts machen. Auf dem UNO sind das alle. Auf dem Mega nicht.

Das bessere AltSoftSerial geht nur auf bestimmten Pins:
https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html

hi,

trotzdem bin ich immer noch neugierig: warum eigentlich softserial?

gruß stefan

Flexibilität?
Musste mich in die Materie einarbeiten und habe dazu einige Beispiele gefunden.