Indicateur de balance USB-RS232 sur Pi : erreur de permission, ttyUSB0/ttyUSB1 change, readline bloque
Traduit de Türkçe par IA ·
Salut. Nous avons un indicateur de pesée dans l’entrepôt (sortie RS232, envoi continu du poids). Je l’ai connecté à un Raspberry Pi 4 avec un convertisseur USB-RS232 ; mon objectif est de lire le poids avec Python et de l’envoyer à Hermetry via MQTT. Sur le Pi, j’ai Raspberry Pi OS Lite, Python 3.11, pyserial 3.5.
Lors de la première tentative, j’ai obtenu cette erreur :
serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyUSB0:
[Errno 13] Permission denied: '/dev/ttyUSB0'
Le code est simple :
ser = serial.Serial('/dev/ttyUSB0', 9600)
while True:
line = ser.readline()
print(line)
Que dois-je faire ? De plus, je voudrais que ce programme fonctionne plus tard en tant que service autonome ; je serais ravi de vos suggestions en ce sens.
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.
Traduit de Türkçe par IA ·
Est-ce que ça arrive quand on lance avec sudo ? C’était mon cas aussi.
sudo ile çalıştırınca oluyor mu? Bende öyle olmuştu.
Traduit de Türkçe par IA ·
D’accord, mais ne lance pas le service en root. Ajoute l’utilisateur au groupe dialout : sudo usermod -aG dialout $USER, puis déconnecte-toi et reconnecte-toi.
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.
Traduit de Türkçe par IA ·
Le problème de permission est réglé avec dialout, merci. Mais deux nouveaux soucis : après un redémarrage du Pi, l’indicateur devient parfois ttyUSB1 (il y a aussi un USB-RS485 sur le même Pi), et readline attend parfois indéfiniment sans rien afficher. Dans un programme de terminal, les données de l’indicateur arrivent pourtant bien.
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.
Traduit de Türkçe par IA ·
J’ai rencontré les deux, dans un projet de pesée.Nom du port : le numéro ttyUSB est attribué selon l’ordre d’énumération, donc ne lui fais pas confiance. Regarde avec ls -l /dev/serial/by-id/, il y a un nom permanent qui contient le numéro de série du convertisseur, utilise-le. Si tu as deux puces identiques sans numéro de série, tu peux les nommer selon le port USB avec une règle udev, mais la plupart du temps by-id suffit.readline : par défaut, il attend . La plupart des indicateurs terminent leurs lignes par
, donc il ne rend jamais la main. De plus, sans timeout, il attend indéfiniment quand le câble est débranché. Voici ce que j’utilise :
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 # pas de données depuis 2 s, journaliser ici
buf += chunk
while b'' in buf:
line, buf = buf.split(b'', 1)
w = parse_weight(line) # ex. b'ST,GS,+0012.45kg'
if w is not None:
client.publish('v1/telemetry', json.dumps({'weight_kg': w}), qos=1)
Si l’indicateur affiche plusieurs fois par seconde, n’envoie pas chaque ligne. Envoie une fois par seconde, ou seulement les lignes ST (stable). Écris une unit systemd pour le service, mets ton propre utilisateur dans la ligne User=, et utilise 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.
Traduit de Türkçe par IA ·
Le caractère de fin de ligne est bien , je l’ai vérifié avec hexdump. Le problème de port est aussi réglé avec by-id. Maintenant j’envoie juste les lectures stables une fois par seconde, et ça tourne sans problème depuis 2 jours avec systemd. Merci.
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.
Traduit de Türkçe par IA ·
Sur les convertisseurs bon marché à CH340, il n’y a pas de numéro de série et les deux apparaissent identiques sous by-id. Dans ce cas, utilisez /dev/serial/by-path/, il reste lié au port 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.
- Vous devez être connecté pour répondre à ce sujet.
Rejoignez la discussion
Connectez-vous pour poser et répondre à des questions, aimer les messages utiles et marquer la réponse qui a résolu votre problème. Chaque contribution rapporte des points et des niveaux.

