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

¿Leer un bus multipunto de 9 bits con una pasarela Pi: puede la UART hacerlo?

¿Leer un bus multipunto de 9 bits con una pasarela Pi: puede la UART hacerlo?

Resuelto 6 5

Traducido del English por IA ·

Planta de alimentos y bebidas, línea de llenado antigua. Cuatro indicadores de pesaje se comunican por un bus multipunto RS-485 propietario de los 90: 9600 baudios, 9 bits de datos, donde el noveno bit marca un byte de dirección. El PLC original que los consultaba se está muriendo y quiero un Pi 4 con un HAT RS-485 que tome el sondeo y reporte cada indicador a Hermetry como un dispositivo propio.La parte de Hermetry creo entenderla: la Pi es una pasarela y envía v1/gw/telemetry con los cuatro indicadores como hijos. Lo que no sé es cómo obtener tramas de 9 bits desde una UART de Linux. pyserial solo ofrece de 5 a 8 bits de datos. ¿Es posible en una Pi, o necesito otro hardware?

♥ 2

Traducido del English por IA ·

¿Para qué sirve exactamente el noveno bit? Solo he visto 8N1.

♥ 1

Traducido del English por IA ·

¿Con qué frecuencia necesitas las lecturas? Si es lento, muchos parches se vuelven aceptables.

QoS 1 and a lot of patience.
♥ 2

Traducido del English por IA ·

Una vez por segundo por indicador es más que suficiente. David, el noveno bit le dice a cada nodo: «este byte es una dirección, despierta y comprueba si es la tuya». Los bytes de datos lo tienen en 0.

♥ 0

Traducido del English por IA ·

Muchos STM32 manejan 9 bits de forma nativa. Un Blue Pill como puente que convierta a serie de 8 bits para la Pi sería la respuesta sencilla y fiable.

♥ 0

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

Traducido del English por IA ·

Kevin, funciona. Byte de dirección con mark, datos con space, PARMRK en el lado de recepción. Los indicadores 1, 2 y 4 respondieron a la primera, el número 3 quería una pausa de 2 ms tras la dirección, que añadí. Los dispositivos secundarios aparecieron en Hermetry con el primer v1/gw/telemetry. Mantengo la idea del STM32 de Jason como plan B por si la gente de línea se queja.

♥ 0
Viendo 7 entradas – de la 1 a la 7 (de un total de 7)
  • Debes estar registrado para responder a este debate.

Únete a la conversación

Inicia sesión para preguntar y responder, dar me gusta a las publicaciones útiles y marcar la respuesta que resolvió tu problema. Cada aportación suma puntos y niveles.

Compartir