Nouveau : le pare-feu IA surveille toute la plateforme et explique chaque incident en termes simples. Découvrez comment ça marche

Indicateur de balance USB-RS232 sur Pi : erreur de permission, ttyUSB0/ttyUSB1 change, readline bloque

Indicateur de balance USB-RS232 sur Pi : erreur de permission, ttyUSB0/ttyUSB1 change, readline bloque

Résolu 6 5

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.

♥ 0

Traduit de Türkçe par IA ·

Est-ce que ça arrive quand on lance avec sudo ? C’était mon cas aussi.

♥ 0

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.

Sahadan selamlar.
♥ 0

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.

♥ 0

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.

Ağ geçidi yine bağlanıyor…
Solution acceptée♥ 5

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.

♥ 0

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.

♥ 1
7 sujets de 1 à 7 (sur un total de 7)
  • 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.

Partager