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.

