Novedad: el cortafuegos de IA supervisa toda la plataforma y explica cada incidente con palabras sencillas. Vea cómo funciona

Respuesta: Leer un bus multipunto de 9 bits en una pasarela Pi: ¿puede el UART hacerlo?

Traducido del English por IA ·

Soy nuevo en el lado del hardware, pero llevo años trabajando con protocolos serie por software, y esto se puede simular con paridad. El noveno bit se envía en el lugar donde iría el bit de paridad. Linux admite paridad «stick» mediante el indicador CMSPAR: con PARENB|CMSPAR|PARODD el bit de paridad siempre es 1 (mark); sin PARODD, siempre es 0 (space).Así que: configurar paridad mark, escribir el byte de dirección, esperar a que salga (tcdrain), cambiar a paridad space y escribir los bytes de datos. En 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]))

La recepción es la parte más incómoda: active PARMRK e INPCK, y un byte con la paridad «incorrecta» llega precedido por 0xFF 0x00, lo que indica su noveno bit. A 9600 baudios, el tiempo entre el byte de dirección y los de datos tiene una pequeña pausa por el cambio, aunque a la mayoría de los dispositivos antiguos no les importa. Use el UART PL011 (disable-bt), no el mini UART, porque el mini UART no tiene paridad.Luego, cada indicador se envía como un hijo, algo como {«scale-1»: {«values»: {«kg»: 12.45}}} en v1/gw/telemetry.

Measure twice, poll once.
Solución aceptada♥ 9