ich bin total verzweifelt, da ich mit meiner Schnittstelle nicht weiterkomme.
So jetzt zu meinem Projekt:
Ich würde gerne mein Wohnmobilsteuereinheit gegen eine Raspberry Pi tauschen und von dieser alle Daten wie Batterieanzeige, Tankinhalte, Beleuchtung schalten,... übernehmen. Im Netz habe ich hierzu einen Beitrag ( https://github.com/class142/ne-rs485) gefunden. Also ran ans Werk, Raspberry Pi 3+ hatte ich noch und eine RS485/Can Schnittstellenkarte (https://www.waveshare.com/wiki/RS485_CAN_HAT) besorgt. Danach den Python-Code etwas umgeschrieben und ausprobiert. Leider kann ich die Daten aus dem Wohnmobil nur auslesen wenn ich einen Time-Sleep von mindesten 10 Sekunden einbaue, sonst kommt nur der erste Teil des Telegrammes an.
Code: Alles auswählen
import serial
import serial.rs485
import time
import RPi.GPIO as GPIO
import binascii
from checksum_calculator import *
EN_485 = 4
GPIO.setmode(GPIO.BCM)
GPIO.setup(EN_485,GPIO.OUT)
GPIO.output(EN_485,GPIO.HIGH)
GPIO.set_asyncgen_hooks = 0 # 1(alterWert)
data0 = bytearray (b'\xff\x00\x00\x00\xff')
data1 = bytearray (b'\xff\x40\x00\x00\x3f')
data2 = bytearray (b'\xff\x01\x00\x00\x00')
data3 = bytearray (b'\xff\x02\x00\x00\x01')
data4 = bytearray (b'\xff\x04\x00\x00\x03')
data5 = bytearray (b'\xff\x00\x00\xc0\xff') #init
data6 = bytearray (b'\xff\x40\x00\xc0\xbf') #init
data7 = bytearray (b'\xff\x01\x00\xc0\xc0') #innenlicht
data8 = bytearray (b'\xff\x02\x00\xc0\xc1') #aussenlicht
data9 = bytearray (b'\xff\x04\x00\xc0\xc3') #pumpe
ser = serial.Serial()
def initSerial():
global ser
ser.baudrate = 38400
ser.port = "/dev/ttyS0"
ser.timeout = 1
ser.stopbits = serial.STOPBITS_ONE
ser.bytesize = 8
ser.parity = serial.PARITY_NONE
ser.rtscts = True
ser.xonXoff = 1
def main():
initSerial()
global ser
ser.open()
while True:
GPIO.output(EN_485, GPIO.HIGH)
time.sleep(1)
ser.write(data0)
time.sleep(0)
GPIO.output(EN_485, GPIO.LOW)
str = ser.readline()
if str:
print (str)
byte_Frischwassertank = (str[5:6])
byte_Grauwassertank1 = (str[6:7])
byte_Grauwassertank2 = (str[7:8])
byte_Fahrzeugbatterie = (str[12:13])
int_Fahrzeugbatterie = int.from_bytes(byte_Fahrzeugbatterie, "big")
byte_Bordbatterie = (str[13:14])
int_Bordbatterie = int.from_bytes(byte_Bordbatterie, "big")
byte_Anzeige1 = (str[15:16])
byte_Anzeige2 = (str[16:17])
byte_checksummme_Empfang = (str[5:20])
#print(( 'checksumme :'),(is_checksum8_mod256(byte_checksummme_Empfang.hex())))
checksummeOK = (is_checksum8_mod256(byte_checksummme_Empfang.hex()))
if checksummeOK:
#Berechnung Füllstand Frischwassertank
if byte_Frischwassertank == (b'\x00'):
print('Frischwassertank : Leer')
elif byte_Frischwassertank == (b'\x01'):
print('Frischwassertank : 1/3 voll')
elif byte_Frischwassertank == (b'\x02'):
print('Frischwassertank : 2/3 voll')
elif byte_Frischwassertank == (b'\x07'):
print('Frischwassertank : voll')
else:
print('Frischwassertank : Fehler')
#Berechnung Füllstand Grauwassertankwassertank
if byte_Grauwassertank1 == (b'\x20'):
print('Grauwassertank : Leer')
elif byte_Grauwassertank1 == (b'\x21'):
print('Grauwassertank : 1/3 voll')
elif byte_Grauwassertank1 == (b'\x22'):
print('Grauwassertank : 2/3 voll')
elif byte_Grauwassertank1 == (b'\x27'):
print('Grauwassertank : voll')
else:
print('Grauwassertank : Fehler')
#Berechung Batterieanzeige Bordbatterie
print(('Boardbatterie :'),round(((int_Bordbatterie)/12.2), 1),('Vdc'))
#Berechung Batterieanzeige BFahrzeugbatterie
print(('Fahrzeugbatterie :'),round(((int_Fahrzeugbatterie)/12.2), 1),('Vdc'))
#Berechnung Innenlicht
if byte_Anzeige1 == (b'\x01') or byte_Anzeige1 == (b'\x03') or byte_Anzeige1 == (b'\x05') or byte_Anzeige1 == (b'\x07'):
print('Innenlicht : An')
else:
print('Innenlicht : Aus')
#Berechnung Aussenlicht
if byte_Anzeige1 == (b'\x02') or byte_Anzeige1 == (b'\x03') or byte_Anzeige1 == (b'\x06') or byte_Anzeige1 == (b'\x07'):
print('Aussenlicht : An')
else:
print('Aussenlicht : Aus')
#Berechnung Wasserpumpe
if byte_Anzeige1 == (b'\x04') or byte_Anzeige1 == (b'\x05') or byte_Anzeige1 == (b'\x06') or byte_Anzeige1 == (b'\x07'):
print('Wasserpumpe : An')
else:
print('Wasserpumpe : Aus')
#Berechnung Statusanzeigebit 1
if byte_Anzeige2 == (b'\x01') or byte_Anzeige2 == (b'\x03') or byte_Anzeige2 == (b'\x05') or byte_Anzeige2 == (b'\x07'):
print('Statusbit1 : An')
else:
print('Statusbit1 : Aus')
#Berechnung Statusanzeigebit 2
if byte_Anzeige2 == (b'\x02') or byte_Anzeige2 == (b'\x03') or byte_Anzeige2 == (b'\x06') or byte_Anzeige2 == (b'\x07'):
print('Statusbit2 : An')
else:
print('Statusbit2 : Aus')
#Berechnung Sicherung defekt
if byte_Anzeige2 == (b'\x04') or byte_Anzeige2 == (b'\x05') or byte_Anzeige2 == (b'\x06') or byte_Anzeige2 == (b'\x07'):
print('Sicherungen : Defekt')
else:
print('Sicherungen : OK')
print(( 'checksumme :'),(is_checksum8_mod256(byte_checksummme_Empfang.hex())))
time.sleep(0.3)
if __name__ == "__main__":
main()
Und die Anwort vom Wohnmobil kommt:
Code: Alles auswählen
b'\xff\xff\xff\x01\xff\x00 \x00\x10\x00\x00\x00\x00\\\xff\x10\x00\x00\x00\x9b'
Frischwassertank : Leer
Grauwassertank : Leer
Boardbatterie : 7.5 Vdc
Fahrzeugbatterie : 0.0 Vdc
Innenlicht : Aus
Aussenlicht : Aus
Wasserpumpe : Aus
Statusbit1 : Aus
Statusbit2 : Aus
Sicherungen : OK
checksumme : True
Code: Alles auswählen
b'\xff\xff\xff\x01\xff'
checksumme : False
b'\xff\xff\xff\x01\xff'
checksumme : False
b'\xff\xff\xff\x01\xff'
checksumme : False
b'\xff\xff\xff\x01\xff'
checksumme : False
b'\xff\xff\xff\x01\xff'
checksumme : False
b'\xff\xff\xff\x01\xff'
checksumme : False
b'\xff\xff\xff\x01\xff'
checksumme : False
Ich hoffe ihr habt eine Lösung für mich.
Lieben Gruß
Tola-Emma
_____________________________________________________________________________________________________