Problem mit UART / RS485

  • Hi,

    ich bastle an einem kleinen RPI Projekt. Das Ziel des ganzen ist es, den Raspberry per RS485 mit ein paar ATmegA Controllern zu vernetzen. Der Raspberry soll dabei als Master agieren. Ein Protokoll habe ich schon implementiert.
    Hardwaremäßig verwendet ich einen MAX3485 und alle Teilnehmer mit 3,3V. Der MAX ist mit der seriellen Schnittstelle des RPI verbunden. Um sehen zu können, was auf meinem Bus passiert habe ich einen USB - Seriell Wandler mit RS485 Receiver, am Laptop angeschlossen somit kann ich die Kommunikation recht gut nachverfolgen.

    Soweit funktioniert das auch. Der Raspberry sendet, der ATmegA antwortet. Am PC ist alles wunderbar. Nur der Raspberry empfängt immer wieder falsche Bytes, mitten in einem Telegram. Ich habe keine Ahnung warum. Da ich zuerst am RS485 Transceiver gezweifelt habe, habe ich auch mal die Daten zwischen Transceiver --> Raspberry abgegriffen. Alles wunderbar.

    Das ganze ist bisher recht rudimentär programmiert.
    Hier mal der Code wie ich einen request an den ATmegA sende:

    Beim empfangen wird ein event ausgelöst, das sieht so aus:

    Code
    this.rs485Bus.addListener(new SerialDataListener() {
    					@Override
    					public void dataReceived(SerialDataEvent event) {
    						//Write Data to receive Buffer
    						receive(event.getData().getBytes());
    						// print out the data received to the console
    						//System.out.print(event.getData());
    					}            
    				});

    Hatte jemand mal ein ähnliches Problem oder kann mir einen Typ geben, was ich noch versuchen kann? Ich verstehe nicht wie auf dem Bus die richtigen Daten anliegen können, der Raspberry jedoch die falschen einliest...

    Schonmal Danke und viele Grüße

    Matthias

  • Hi,

    schonmal Danke für eure Antworten.
    Threading hatte ich auch im verdacht. Allerdings habe ich das ganze in eine Test Projekt nochmal versucht, welches nur einen Thread hatte. Der Bereich im Event ist über eine Semaphore gesichert. Sollte also ein zweites receive event kommen werden die Daten übersprungen.
    Meine receve methode sieht so aus:

    Den Schaltplan, wie ich den MAX angeschlossen habe, habe ich als Anhang angefügt.
    Das OS sollte mit der seriellen Schnittstelle auch nichts mehr anstellen.

    Viele Grüße

    Matthias

    Achso ganz vergessen, was den MAX3140 angeht, eigentlich wollte ich mit 2 Leitungen auskommen. An Datenrate ist es auch nicht so viel, dass ich darauf angewiesen wäre.
    Allerdings ist senden und Empfangen ja auch "hart" getrennt, da ich den Pin schalten muss. Was ja auch zu funktionieren scheint.

    Viele Grüße
    Matthias

    Einmal editiert, zuletzt von matthias2707 (5. Juli 2014 um 11:29)

  • Hi,
    hat da keiner mehr eine Idee für mich? Bin da gerade echt planlos. Es scheint sogar immer das selbe falsche Byte zu sein das auftaucht. Also kann es eigentlich fast keine Störung sein.

    Danke und viele grüße

    Matthias

  • Hallo Mathias(2707).

    Ich beginne auch damit, den Raspi als Master zu benutzen, um verschiedenen Geräte per modbus anzusprechen.

    Ich hoffe, ich liege richtig, wenn ich folgende Vorgehensweise habe:

    1. die Hardware: an die RS232-Anschlüsse des Raspi den Hardware-Konverter zur RS485-Seite dazwischen zu klemmen, die einzelnen Geräte als Bus miteinander zu verbinden und einen Abschlußwiderstand von 120 Ohm anzuhängen.

    2. die Software: per modbus-Protokoll die einzelnen Geräte anzusprechen/abzufragen.

    Was ist aber, wenn man dann die Geräte mit Adresse "1" abfragt ? Wer antwortet von den vielen Geräten (denn sie heißen im ersten Moment ja wohl alle "1", oder ?).
    Wie macht man es, wenn die Geräte verschiedene Baudraten haben (1200 und 9600 Baud) ?

    Du siehst, ich bin neu im Thema. Du bist vielleicht schon weiter und würdest mir etwas erzählen ? Ich wäre sehr dankbar.

    Freddy

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!