Von Türkçe mit KI übersetzt ·
Beides hatte ich selbst, bei einem Wägeprojekt.Portname: Die ttyUSB-Nummer wird nach der Reihenfolge der Erkennung vergeben, also nicht darauf verlassen. Schau mit ls -l /dev/serial/by-id/ nach, dort gibt es einen dauerhaften Namen mit der Seriennummer des Wandlers, den nimm. Wenn du zwei gleiche Chips ohne Seriennummern hast, kannst du per udev-Regel nach USB-Port benennen, aber meistens reicht by-id.readline: Standardmäßig wartet es auf . Die meisten Anzeigen beenden Zeilen mit
, deshalb kehrt es nie zurück. Außerdem wartet es ohne Timeout bei abgezogenem Kabel ewig. Das benutze ich:
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 # keine Daten seit 2 s, hier loggen
buf += chunk
while b'' in buf:
line, buf = buf.split(b'', 1)
w = parse_weight(line) # z. B. b'ST,GS,+0012.45kg'
if w is not None:
client.publish('v1/telemetry', json.dumps({'weight_kg': w}), qos=1)
Wenn die Anzeige mehrmals pro Sekunde ausgibt, sende nicht jede Zeile. Sende einmal pro Sekunde oder nur die ST-Zeilen (stabil). Schreib eine systemd-Unit für den Dienst, trag deinen eigenen Benutzer in die Zeile User= ein und nimm 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.

