Indicador de báscula USB-RS232 en Pi: error de permisos, ttyUSB0/ttyUSB1 cambia, readline se bloquea
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.
Selam. Depoda bir tartı indikatörümüz var (RS232 çıkışlı, sürekli ağırlık basıyor). Raspberry Pi 4’e USB-RS232 çevirici ile bağladım, amacım ağırlığı Python ile okuyup MQTT ile Hermetry’ye göndermek. Pi’de Raspberry Pi OS Lite, Python 3.11, pyserial 3.5.
İlk denemede şu hatayı aldım:
serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyUSB0:
[Errno 13] Permission denied: '/dev/ttyUSB0'
Kod basit:
ser = serial.Serial('/dev/ttyUSB0', 9600)
while True:
line = ser.readline()
print(line)
Ne yapmam lazım? Bir de ileride bu servis olarak kendi kendine çalışacak, ona göre önerirseniz sevinirim.
Traducido del Türkçe por IA ·
¿Pasa al ejecutarlo con sudo? A mí me pasó lo mismo.
sudo ile çalıştırınca oluyor mu? Bende öyle olmuştu.
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.
Olur ama servisi root ile çalıştırma. Kullanıcıyı dialout grubuna ekle: sudo usermod -aG dialout $USER, sonra çıkış yapıp tekrar gir.
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.
dialout ile izin sorunu gitti, teşekkürler. Ama iki yeni dert: Pi’yi yeniden başlatınca bazen ttyUSB1 oluyor (aynı Pi’de bir de USB-RS485 var), ve readline bazen sonsuza kadar bekliyor, hiçbir şey basmıyor. Terminal programında indikatör verisi akıyor ama.
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.
İkisini de yaşadım, bir kantar projesinde.
Port adı: ttyUSB numarası takılma sırasına göre veriliyor, güvenme. ls -l /dev/serial/by-id/ ile bak, orada çeviricinin seri numaralı kalıcı adı var, onu kullan. Aynı çipten iki tane varsa ve seri numaraları yoksa udev kuralıyla USB portuna göre isim verirsin, ama çoğu zaman by-id yetiyor.
readline: varsayılan olarak bekliyor. Çoğu indikatör satırı
ile bitiriyor, o yüzden hiç dönmüyor. Bir de timeout vermezsen kablo çıktığında da sonsuza kadar bekler. Benim kullandığım:
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 # 2 sn veri yok, burada log yaz
buf += chunk
while b'
' in buf:
line, buf = buf.split(b'
', 1)
w = parse_weight(line) # örn. b'ST,GS,+0012.45kg'
if w is not None:
client.publish('v1/telemetry', json.dumps({'weight_kg': w}), qos=1)
İndikatör saniyede birkaç kez basıyorsa her satırı gönderme. Hermetry’de cihaz başına varsayılan limit saniyede 10 mesaj, üstü sessizce düşüyor. Saniyede bir, ya da sadece ST (stabil) satırlarını yolla. Servis için systemd unit yaz, User= satırına kendi kullanıcını koy, Restart=always.
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.
Satır sonu gerçekten imiş, hexdump ile baktım. by-id ile port sorunu da bitti. Şimdi sadece stabil okumaları saniyede bir yolluyorum, systemd ile 2 gündür sorunsuz. Sağ olun.
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.
CH340’lı ucuz çeviricilerde seri numarası olmuyor, by-id’de ikisi aynı görünür. O durumda /dev/serial/by-path/ kullanın, USB portuna bağlı kalıyor.
- 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.

