Serielle Geräte anschließen (Compact)

Mit dem RS485-Anschluss kannst Du serielle Geräte wie z. B. einen Sensor kostengünstig in Dein System einbinden.

Die Datenleitungen der RS485-Buchse sind mit P (positive) und N (negative) bezeichnet. Bei anderen Geräten werden diese Leitungen auch häufig D+ und D- oder A und B bezeichnet.

 

Für die eigentliche Datenübertragung werden nur die Leitungen N und P benötigt. Wir empfehlen Dir, bei größeren Leitungslängen oder Baudraten ein verdrilltes Pärchen zu verwenden.

Falls ein Bezugspotenzial notwendig sein sollte, kannst Du die elektrische Schaltungsmasse an Klemme “┴” dazu verwenden. Diese Verbindung solltest Du jedoch nur herstellen, wenn sie wirklich erforderlich ist. Den Leitungsschirm schließt Du am besten an der FE-Klemme an.

Leitungen mit einer Länge >30m oder Leitungen, die das Gebäude verlassen, müssen immer geschirmt sein. Um die EMV-Eigenschaften des Schirmes noch zu verbessern, verbindest du den Schirm großflächig mit einer leitfähigen Kabelschelle mit der geerdeten Montageplatte. Alternativ kannst Du für die Durchführung der Leitung durch die Schaltschrankwand eine leitfähige EMV-Kabelverschraubung verwenden.

Von Linux aus wird die Schnittstelle über das Character Device /dev/ttyRS485 angesprochen. Du kannst Bitraten bis 3.000.000 konfigurieren. Allerdings kann es bei mehr als 230.400 Bit zu gelegentliche Empfangsfehlern kommen. Das liegt daran, dass der UART des Raspberry Pi, an den die Schnittstelle angeschlossen ist, nur eine 16 Byte kleine FIFO hat und kein DMA unterstützt. Je höher die Bitrate, desto häufiger passiert es, dass die FIFO nicht schnell genug ausgelesen wird und empfangene Daten verloren gehen. Beispielsweise kommt es bei 460.800 Bit zu 1-2 Fehlern pro empfangenen 50 MByte, bei 921.600 Bit zu rund 10 Fehlern. Wenn Dein RevPi Compact vorwiegend Daten sendet und nur selten empfängt, kannst du bedenkenlos auch höhere Bitraten verwenden, ansonsten empfehlen wir Dir aber, nicht mehr als 230.400 Baud einzustellen.

Die Schnittstelle verfügt über einen integrierten Abschlusswiderstand mit 120 Ohm. Diese Terminierung ist nach dem Booten ausgeschaltet. Das ist am sichersten, denn wenn mehrere Geräte am RS485-Bus ihre Terminierung einschalten, ist gar keine Kommunikation möglich. Über kurze Kabel ist die Kommunikation auch ohne Terminierung möglich. Für längere Distanzen solltest Du sie einschalten, falls sich Dein RevPi Compact am Ende des Busses befindet.

Das Ein- und Ausschalten der Terminierung geschieht folgendermaßen:

  1. Öffne das Character Device /dev/ttyRS485 mit open().

  2. Lies die aktuelle RS485-Konfiguration mit einem TIOCGRS485 ioctl() aus.

  3. Setze oder lösche das SER_RS485_TERMINATE_BUS Flag in der struct serial_rs485.

  4. Aktiviere die geänderte RS485-Konfiguration mit einem TIOCSRS485 ioctl().

  5. Schließe das Character Device mit close().

Diese Schritte musst du nach jedem Booten wiederholen, falls die Terminierung eingeschaltet sein soll. Wir haben ein C Listing mit diesen Schritten vorbereitet, das Du nur noch Kompilieren brauchst:

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <linux/serial.h>
#include <sys/ioctl.h>

int main(int argc, char **argv)
{
	struct serial_rs485 rs485conf;
	int fd, ret;

	if (argc != 2) {
		printf("Usage: %s <device>\n", argv[0]);
		return 0;
	}

	fd = open(argv[1], O_RDWR);
	if (fd < 0) {
		printf("Cannot open: %s\n", strerror(errno));
		return errno;
	}

	ret = ioctl(fd, TIOCGRS485, &rs485conf);
	if (ret < 0) {
		printf("Cannot get rs485 config: %s\n", strerror(errno));
		return errno;
	}

	rs485conf.flags ^= SER_RS485_TERMINATE_BUS;

	ret = ioctl(fd, TIOCSRS485, &rs485conf);
	if (ret < 0) {
		printf("Cannot set rs485 config: %s\n", strerror(errno));
		return errno;
	}

	ret = close(fd);
	if (ret < 0) {
		printf("Cannot close: %s\n", strerror(errno));
		return errno;
	}
}