Neu: Die KI-Firewall überwacht die gesamte Plattform und erklärt jeden Vorfall in einfachen Worten. So funktioniert es

Einen 9-Bit-Multidrop-Bus über ein Pi-Gateway auslesen: Kann die UART das überhaupt?

Einen 9-Bit-Multidrop-Bus über ein Pi-Gateway auslesen: Kann die UART das überhaupt?

Gelöst 6 5

Von English mit KI übersetzt ·

Lebensmittel- und Getränkebetrieb, alte Abfüllanlage. Vier Wägeindikatoren kommunizieren über einen proprietären RS-485-Multidrop-Bus aus den 90er-Jahren: 9600 Baud, 9 Datenbits, wobei das 9. Bit ein Adressbyte markiert. Die ursprüngliche SPS, die sie abgefragt hat, fällt aus, und ich möchte einen Pi 4 mit einem RS-485-HAT einsetzen, der das Pollen übernimmt und jeden Indikator als eigenes Gerät an Hermetry meldet.Den Hermetry-Teil glaube ich zu verstehen: Der Pi ist ein Gateway und sendet v1/gw/telemetry mit den vier Indikatoren als Child-Geräten. Was ich nicht weiß, ist, wie man 9-Bit-Frames aus einer Linux-UART bekommt. pyserial unterstützt nur 5 bis 8 Datenbits. Ist das auf einem Pi überhaupt möglich, oder brauche ich andere Hardware?

♥ 2

Von English mit KI übersetzt ·

Wofür genau ist das 9. Bit? Ich habe bisher immer nur 8N1 gesehen.

♥ 1

Von English mit KI übersetzt ·

Wie oft brauchst du Messwerte? Wenn es langsam sein darf, werden viele Workarounds akzeptabel.

QoS 1 and a lot of patience.
♥ 2

Von English mit KI übersetzt ·

Einmal pro Sekunde pro Anzeige reicht völlig. David, das 9. Bit sagt jedem Knoten: „Dieses Byte ist eine Adresse, wach auf und prüfe, ob sie dir gehört“. Datenbytes haben es auf 0.

♥ 0

Von English mit KI übersetzt ·

Viele STM32 beherrschen 9 Bit nativ. Ein Blue Pill als Brücke, die auf 8-Bit-Serial für den Pi umsetzt, wäre die unspektakuläre, zuverlässige Antwort.

♥ 0

Von English mit KI übersetzt ·

Ich bin neu auf der Hardware-Seite, habe aber jahrelang serielle Protokolle in Software umgesetzt, und man kann das mit Parität nachbilden. Das 9. Bit wird dort gesendet, wo das Paritätsbit stehen würde. Linux unterstützt „Stick“-Parität über das CMSPAR-Flag: Mit PARENB|CMSPAR|PARODD ist das Paritätsbit immer 1 (Mark), ohne PARODD immer 0 (Space).Also: Mark-Parität setzen, das Adressbyte schreiben, warten bis es hinaus ist (tcdrain), auf Space-Parität umschalten, die Datenbytes schreiben. In Python:

import termios, serial
CMSPAR = 0o10000000000
s = serial.Serial('/dev/ttyAMA0', 9600)
def set_bit9(on):
a = termios.tcgetattr(s.fd)
a[2] |= termios.PARENB | CMSPAR
a[2] = a[2] | termios.PARODD if on else a[2] & ~termios.PARODD
termios.tcsetattr(s.fd, termios.TCSADRAIN, a)
set_bit9(True);  s.write(bytes([0x03])); s.flush()
set_bit9(False); s.write(bytes([0x10, 0x00]))

Der Empfang ist die unangenehmere Hälfte: PARMRK und INPCK aktivieren, dann kommt ein Byte mit der „falschen“ Parität mit dem Präfix 0xFF 0x00 an, das dir sein 9. Bit verrät. Bei 9600 entsteht zwischen Adress- und Datenbytes durch das Umschalten eine kleine Lücke, die meisten alten Geräte stört das nicht. Verwende den PL011-UART (disable-bt), nicht den Mini-UART, denn der Mini-UART hat keine Parität.Dann wird jeder Indikator als Kind gesendet, etwa so: {„scale-1“: {„values“: {„kg“: 12.45}}} auf v1/gw/telemetry.

Measure twice, poll once.
Akzeptierte Lösung♥ 9

Von English mit KI übersetzt ·

Kevin, es funktioniert. Adressbyte mit Mark, Daten mit Space, PARMRK auf der Empfangsseite. Die Indikatoren 1, 2 und 4 haben beim ersten Versuch geantwortet, Nummer 3 wollte eine Lücke von 2 ms nach dem Adressbyte, die ich ergänzt habe. Die Kinder erschienen in Hermetry bei der ersten v1/gw/telemetry. Jasons STM32-Idee behalte ich als Plan B, falls die Leitungsleute sich beschweren.

♥ 0
Ansicht von 7 Beiträgen – 1 bis 7 (von insgesamt 7)
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.

Mitdiskutieren

Melde dich an, um Fragen zu stellen und zu beantworten, hilfreiche Beiträge mit „Gefällt mir“ zu markieren und die Antwort zu kennzeichnen, die dein Problem gelöst hat. Jeder Beitrag bringt Punkte und Stufen.

Teilen