Seite 1 von 1

Raspberry mit Waveshare HAT 2-CH RS485

Verfasst: Sonntag 28. Juni 2026, 13:11
von kiaralle
Ein Hallo in die Runde,

ich versuche gerade ein Aufsatz für den Rapberry in Betreib zu nehmen.
Dazu habe ich den Code, eine Lib von Waveshare in meinen Code verbastelt, welcher so scheinbar läuft, aber ein paar Fragen für mich aufwirft.

https://www.waveshare.com/wiki/2-CH_RS ... 7cRwHaclk

Da ich einen Raspberry 5 verwende ist doch die Verwendung von RPi.GPIO nicht korrekt. Oder?

Die beiden RS485-Kanäle sind mit Kabeln zueinander verbunden, ich fahre also im Kreis ohne externe RS485-Geräte
Ich sende über "clock" raus und enpfange über "data". Funktioniert also.

das "dev = "/dev/ttyS0"" in der Class bei "def __init__" kann doch durch ein dev = "" ersetzt werden und es funktioiert immer noch.
Wird es durch
endat_clock = RS485config(dev = "/dev/ttySC0")
endat_data = RS485config(dev = "/dev/ttySC1")
definiert?

Code: Alles auswählen

import serial
import RPi.GPIO as GPIO
import time

import os
import sys
import logging


class RS485config(object):
    def __init__(ser, Baudrate = 115200, dev = "/dev/ttyS0"):
        print (dev)
        ser.dev = dev
        ser.serial = serial.Serial(ser.dev, Baudrate)
        GPIO.setmode(GPIO.BCM)
        GPIO.setwarnings(False)
        
        GPIO.setmode(GPIO.BCM)
        
        GPIO.setup(TXDEN_1, GPIO.OUT)
        GPIO.setup(TXDEN_2, GPIO.OUT)

        GPIO.output(TXDEN_1, GPIO.HIGH)
        GPIO.output(TXDEN_2, GPIO.HIGH)
        
    def Uart_SendByte(ser, value): 
        ser.serial.write(value.encode('ascii')) 
    
    def Uart_SendString(ser, value): 
        ser.serial.write(value.encode('ascii'))

    def Uart_ReceiveByte(ser): 
        return ser.serial.read(1).decode("utf-8")

    def Uart_ReceiveString(ser, value): 
        data = ser.serial.read(value)
        return data.decode("utf-8")
        
    def Uart_Set_Baudrate(ser, Baudrate):
         ser.serial = serial.Serial(ser.dev, Baudrate)
    
  
logging.basicConfig(level=logging.INFO)
libdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')
if os.path.exists(libdir):
    sys.path.append(libdir)

TXDEN_1 = 27
TXDEN_2 = 22

endat_clock = RS485config(dev = "/dev/ttySC0")
endat_data = RS485config(dev = "/dev/ttySC1")

GPIO.output(TXDEN_1, GPIO.LOW) #send
GPIO.output(TXDEN_2, GPIO.HIGH) #read

clock = endat_clock.Uart_SendString("Hallo")
data = endat_data.Uart_ReceiveString(5)
    
print(data)

Re: Raspberry mit Waveshare HAT 2-CH RS485

Verfasst: Sonntag 28. Juni 2026, 15:24
von DeaD_EyE
Da ich einen Raspberry 5 verwende ist doch die Verwendung von RPi.GPIO nicht korrekt. Oder?
Ist aufgrund einer Hardware-Änderung inkompatibel.
The legacy RPi.GPIO library is incompatible with the Raspberry Pi 5 due to its new RP1 I/O chip. To run old code without rewriting it, use the rpi-lgpio wrapper, which translates RPi.GPIO calls to the modern lgpio library.
rpi-lgpio: https://pypi.org/project/rpi-lgpio/

Da das bei dir zu funktionieren scheint, hast du den Wrapper wahrscheinlich schon. Ansonsten müsste RPi.GPIO eine Fehlermeldung ausgeben.
das "dev = "/dev/ttyS0"" in der Class bei "def __init__" kann doch durch ein dev = "" ersetzt werden und es funktioiert immer noch.
Wird es durch
endat_clock = RS485config(dev = "/dev/ttySC0")
endat_data = RS485config(dev = "/dev/ttySC1")
definiert?
Ja und wenn du nur RS485config() aufrufst, wird die Zuweisung in der Funktionssignatur verwendet, also Baudrate=115200 und dev="/dev/ttyS0".
Da sich das ändern kann, würde ich die Default-Argumente entfernen:

Code: Alles auswählen

def __init__(ser):
Bleibt nur noch `ser` übrig, dass auf die Instanz der Klasse verweist. Aber man verwendet normalerweise das Wort `self` dafür.

Code: Alles auswählen

def __init__(self):
Danach musst du alle Referenzen von `ser.` nach `self.` ändern.