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

Antwort: 9-Bit-Multidrop-Bus an einem Pi-Gateway auslesen: Kann der UART das überhaupt?

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