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

Indicador de báscula USB-RS232 en Pi: error de permisos, ttyUSB0/ttyUSB1 cambia, readline se bloquea

Indicador de báscula USB-RS232 en Pi: error de permisos, ttyUSB0/ttyUSB1 cambia, readline se bloquea

Resuelto 6 5

Traducido del Türkçe por IA ·

Hola. En el almacén tenemos un indicador de báscula (salida RS232, envía el peso continuamente). Lo conecté a una Raspberry Pi 4 con un convertidor USB-RS232; mi objetivo es leer el peso con Python y enviarlo a Hermetry por MQTT. En la Pi tengo Raspberry Pi OS Lite, Python 3.11 y pyserial 3.5.
En el primer intento obtuve este error:

serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyUSB0:
[Errno 13] Permission denied: '/dev/ttyUSB0'

El código es sencillo:

ser = serial.Serial('/dev/ttyUSB0', 9600)
while True:
    line = ser.readline()
    print(line)

¿Qué debo hacer? Además, más adelante quiero que esto se ejecute solo como servicio, así que agradecería sugerencias pensando en eso.

♥ 0

Traducido del Türkçe por IA ·

¿Pasa al ejecutarlo con sudo? A mí me pasó lo mismo.

♥ 0

Traducido del Türkçe por IA ·

Vale, pero no ejecutes el servicio como root. Añade el usuario al grupo dialout: sudo usermod -aG dialout $USER, luego cierra la sesión y vuelve a entrar.

Sahadan selamlar.
♥ 0

Traducido del Türkçe por IA ·

El problema de permisos con dialout ya se resolvió, gracias. Pero tengo dos problemas nuevos: al reiniciar la Pi, a veces el indicador pasa a ser ttyUSB1 (en la misma Pi también hay un USB-RS485), y readline a veces espera para siempre sin imprimir nada. Sin embargo, en un programa de terminal sí llegan los datos del indicador.

♥ 0

Traducido del Türkçe por IA ·

Viví las dos cosas, en un proyecto de báscula.Nombre del puerto: el número ttyUSB se asigna según el orden de enumeración, así que no te fíes de él. Revisa con ls -l /dev/serial/by-id/, ahí hay un nombre permanente que contiene el número de serie del convertidor, úsalo. Si tienes dos chips iguales sin números de serie, puedes nombrarlos por puerto USB con una regla udev, pero casi siempre basta con by-id.readline: por defecto espera
. La mayoría de los indicadores terminan las líneas con , así que nunca retorna. Además, si no pones timeout, espera para siempre cuando se desconecta el cable. Esto es lo que uso:

PORT = '/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A10K3XYZ-if00-port0'
ser = serial.Serial(PORT, 9600, bytesize=8, parity='N', stopbits=1, timeout=2)
buf = b''
while True:
    chunk = ser.read(64)
    if not chunk:
        continue          # sin datos durante 2 s, registrar aquí
    buf += chunk
    while b'' in buf:
        line, buf = buf.split(b'', 1)
        w = parse_weight(line)   # p. ej. b'ST,GS,+0012.45kg'
        if w is not None:
            client.publish('v1/telemetry', json.dumps({'weight_kg': w}), qos=1)

Si el indicador imprime varias veces por segundo, no envíes cada línea. Envía una vez por segundo, o solo las líneas ST (estable). Escribe una unit de systemd para el servicio, pon tu propio usuario en la línea User= y usa Restart=always.

Ağ geçidi yine bağlanıyor…
Solución aceptada♥ 5

Traducido del Türkçe por IA ·

El fin de línea es efectivamente , lo revisé con hexdump. El problema del puerto también se solucionó con by-id. Ahora solo envío las lecturas estables una vez por segundo, y lleva 2 días funcionando sin problemas con systemd. Gracias.

♥ 0

Traducido del Türkçe por IA ·

En los convertidores baratos con CH340 no hay número de serie y ambos aparecen igual en by-id. En ese caso, use /dev/serial/by-path/, que se mantiene vinculado al puerto USB.

♥ 1
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