Ich habe den RS-232-Ausgang einer alten Waagenanzeige direkt an den Pi 4 GPIO angeschlossen, und es kommen seltsame Zeichen an
Von Türkçe mit KI übersetzt ·
Hallo, ich bin Softwareentwickler und die Hardware-Seite ist mir etwas fremd, also sagt Bescheid, wenn ich Unsinn erzähle.Am Wareneingang eines Kunden steht eine alte Waagenanzeige, auf der Rückseite gibt es einen DB9-RS-232-Ausgang. Laut Handbuch druckt sie bei jeder Wägung das Gewicht zeilenweise aus. Mein Ziel ist, das mit einem Raspberry Pi 4 auszulesen, als Telemetrie an Hermetry zu senden und dann die tägliche Tonnage in einem Dashboard anzuzeigen.Was ich gemacht habe: Ich habe die Pins 2, 3 und 5 des DB9 mit Jumperkabeln an die Pins GPIO14 (TX), GPIO15 (RX) und GND des Pi angeschlossen. Über raspi-config habe ich die serielle Schnittstelle aktiviert. In Python lese ich so:
import serial
s = serial.Serial('/dev/serial0', 9600, timeout=2)
while True:
print(s.readline())
Die Ausgabe sieht so aus:
b'ùæ þ'
b'ø '
b'àþ'
Es kommt nichts Sinnvolles dabei heraus. Außerdem erscheint ab und zu im Terminal so etwas wie mein eigener Login-Bildschirm, das habe ich auch nicht verstanden. Ich bin auch nicht sicher, ob ich die Anzeige oder den Pi damit kaputt mache, denn ich habe am Anzeigeausgang mit einem Multimeter etwa -9 V gemessen.
Selam, ben yazılımcıyım, donanım tarafı biraz yabancı, o yüzden saçmalıyorsam söyleyin.
Bir müşterinin depo girişinde eski bir kantar göstergesi var, arkasında DB9 RS-232 çıkışı var. Kılavuza göre her tartımda satır satır ağırlık basıyor. Amacım bunu Raspberry Pi 4 ile okuyup Hermetry’ye telemetri olarak göndermek, sonra dashboard’da günlük tonaj göstermek.
Yaptığım: DB9’un 2, 3 ve 5 numaralı pinlerini jumper kabloyla Pi’nin GPIO14 (TX), GPIO15 (RX) ve GND pinine bağladım. raspi-config’den serial’i açtım. Python’da şöyle okuyorum:
import serial
s = serial.Serial('/dev/serial0', 9600, timeout=2)
while True:
print(s.readline())
Çıktı şöyle:
b'ùæ þ'
b'ø '
b'àþ'
Hiç anlamlı bir şey yok. Bir de arada bir terminalde kendi login ekranım gibi bir şey çıkıyor, onu da anlamadım. Göstergeyi ve Pi’yi yakar mıyım diye de içim rahat değil açıkçası, gösterge çıkışında multimetreyle -9 V gibi bir şey ölçtüm.
Von Türkçe mit KI übersetzt ·
Stimmt die Baudrate? Im Menü der Anzeige könnten es 4800 o. Ä. sein.
Baud doğru mu? Göstergenin menüsünde 4800 falan olabilir.
Von Türkçe mit KI übersetzt ·
Ich habe im Menü nachgesehen, dort steht 9600 8N1. Das Handbuch sagt das auch.
Menüden baktım, 9600 8N1 yazıyor. Kılavuz da öyle diyor.
Von Türkçe mit KI übersetzt ·
Es liegt nicht an der Baudrate, sondern an der Spannung. Wenn du -9 V gemessen hast, steht die Antwort bereits da.Das RS-232-Signal liegt etwa zwischen ±3 und ±15 V und seine Logik ist invertiert: Im Ruhezustand ist es negativ, „1“ ist negativ, „0“ ist positiv. Die UART des Pi arbeitet dagegen mit 3,3 V TTL, 0 bis 3,3 V, und mit normaler Logik. Verbindest du beides direkt, stimmen sowohl Pegel als auch Polarität nicht, und genau dieser Zeichensalat ist die Folge. Außerdem kann eine negative Spannung bzw. rund 9 V an GPIO15 den Pin zerstören. Trenne das sofort; es ist Glück, wenn der Pi noch heil ist.Bei mir in zwei Lagern ist dieselbe Aufgabe angefallen, ich habe zwei Wege genutzt:1. MAX3232-Modul (MAX3232, nicht MAX232; das arbeitet mit 3,3 V). VCC an die 3,3 V des Pi, die TTL-Seite an GPIO14/15, die RS-232-Seite an die DB9. 2. Die sauberere Variante: ein USB-RS232-Wandler (PL2303 oder FTDI-Chip). Er erscheint als /dev/ttyUSB0, und du musst dich gar nicht mit GPIO befassen.Zur Login-Bildschirm-Frage: Die serielle Konsole des Pi ist über /dev/serial0 aktiv. In raspi-config > Interface > Serial Port beantwortest du „login shell over serial“ mit Nein und „serial port hardware“ mit Ja.Und zur TX/RX-Kreuzung: Wir wissen nicht, ob die Waage DCE oder DTE ist. Kommen keine Daten an, tausche Pin 2 und 3.Das Weiterleiten an Hermetry ist danach einfach: Mit paho und Access-Token veröffentlichst du auf v1/telemetry:
import re, json, serial
import paho.mqtt.client as mqtt
c = mqtt.Client(client_id="kantar-1")
c.username_pw_set(TOKEN, "")
c.tls_set()
c.connect(BROKER_HOST, 8883, keepalive=60)
c.loop_start()
s = serial.Serial('/dev/ttyUSB0', 9600, timeout=2)
while True:
line = s.readline().decode('ascii', 'ignore')
m = re.search(r'(-?d+.d+)s*kg', line)
if m:
c.publish("v1/telemetry", json.dumps({"weight_kg": float(m.group(1))}), qos=1)
Baud değil, voltaj sorunu. -9 V ölçtüysen zaten cevap orada.
RS-232 sinyali yaklaşık ±3 ile ±15 V arası ve mantığı ters: boşta negatif, „1“ negatif, „0“ pozitif. Pi’nin UART’ı ise 3.3 V TTL, 0 ile 3.3 V arası ve düz mantık. Doğrudan bağlayınca hem seviye hem polarite yanlış, çıktıdaki çöp tam olarak bu. Üstelik GPIO15’e negatif ve 9 V civarı gerilim vermek pini öldürebilir. Hemen sök, Pi’nin hâlâ sağlam olması şans.
Bende iki depoda aynı iş var, iki yol kullandım:
1. MAX3232 modülü (MAX232 değil, 3232; 3.3 V ile çalışan). VCC’yi Pi’nin 3.3 V’una ver, TTL tarafı GPIO14/15, RS-232 tarafı DB9’a. 2. Daha temizi: USB-RS232 çevirici (PL2303 ya da FTDI çipli). /dev/ttyUSB0 olarak çıkıyor, GPIO ile hiç uğraşmıyorsun.
Login ekranı meselesi: Pi seri konsolu /dev/serial0 üzerinden açık. raspi-config > Interface > Serial Port’ta „login shell over serial“ sorusuna Hayır, „serial port hardware“ sorusuna Evet de.
Bir de TX/RX çaprazlaması: gösterge DCE mi DTE mi bilmiyoruz. Veri gelmezse 2 ile 3’ü yer değiştir.
Okuduktan sonra Hermetry’ye gönderme kısmı basit, paho ile access token’la v1/telemetry‚ye yayınlıyorsun:
import re, json, serial
import paho.mqtt.client as mqtt
c = mqtt.Client(client_id="kantar-1")
c.username_pw_set(TOKEN, "")
c.tls_set()
c.connect(BROKER_HOST, 8883, keepalive=60)
c.loop_start()
s = serial.Serial('/dev/ttyUSB0', 9600, timeout=2)
while True:
line = s.readline().decode('ascii', 'ignore')
m = re.search(r'(-?d+.d+)s*kg', line)
if m:
c.publish("v1/telemetry", json.dumps({"weight_kg": float(m.group(1))}), qos=1)
Von Türkçe mit KI übersetzt ·
Die Umwandlung in eine Zahl per Regex ist wichtig. Wenn die Anzeige Text wie " 12.45 kg" ausgibt und du ihn so weitergibst, bleibt er in Hermetry als Text erhalten, wird nicht im Diagramm dargestellt und es gibt weder einen Stundenmittelwert noch eine Summe. Wir haben in einem Projekt zwei Wochen lang Text gesendet, und als wir es bemerkten, waren die historischen Daten nutzlos.
Regex’le sayıya çevirmesi önemli. Gösterge " 12.45 kg" gibi metin basıyorsa ve onu olduğu gibi gönderirsen Hermetry’de metin olarak kalır, grafikte çizilmez, saatlik ortalama ya da toplam da çıkmaz. Biz bir projede iki hafta metin göndermişiz, fark ettiğimizde geçmiş veri işe yaramıyordu.
Von Türkçe mit KI übersetzt ·
Gelöst, danke euch.Einen USB-RS232-Wandler habe ich nicht gefunden, also habe ich beim Elektroniker ein MAX3232-Modul besorgt. Angeschlossen, wieder Müll gekommen, dann habe ich wie von Esra vorgeschlagen die Pins 2 und 3 gekreuzt, und die Zeilen kamen endlich sauber an. Die serielle Konsole habe ich auch abgeschaltet, der Login-Bildschirm ist verschwunden. GPIO15 ist auch heil geblieben, ich hatte Glück.Dank Tuğbas Hinweis wird weight_kg von Anfang an als Zahl gesendet, und im Dashboard wird ein Diagramm gezeichnet.
Çözüldü, sağ olun.
USB-RS232 çevirici bulamadım, elektronikçiden MAX3232 modülü aldım. Bağladım, yine çöp geldi, sonra Esra’nın dediği gibi 2 ile 3’ü çaprazladım, satırlar düzgün gelmeye başladı. Seri konsolu da kapattım, login ekranı kayboldu. GPIO15 da sağlam çıktı, şanslıymışım.
Tuğba’nın notu sayesinde ilk günden weight_kg sayı olarak gidiyor, dashboard’da grafik çiziliyor.
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.
Mitdiskutieren
Melde dich an, um Fragen zu stellen und zu beantworten, hilfreiche Beiträge mit „Gefällt mir“ zu markieren und die Antwort zu kennzeichnen, die dein Problem gelöst hat. Jeder Beitrag bringt Punkte und Stufen.

