Hallo liebe Forum,
ich habe einem HAT (kBerry) für die Raspi zum verbinden mit einem Gebäudeautomatisierungsbus (KNX).
Ich kann nun mit meinem Programm (in C++ geschrieben) in den Bus und irgendwas in der Anlage steuern (unwichtig für meine Problematik).
Nun will ich auch lesen und dafür wollte ich Python benutzten.
Die benötigte Einstellungen für die ttyAMA0 (raspi 3b+) sind folgende:
Was in den Bus passiert kann ich ganz zuverlässig damit sehen:
Nun möchte ich aber die gleiche output aber mit python lesen und die Daten verarbeiten.
In Fragen kamen das Modul 'Subprocess' und damit socat ausführen oder pyserial zu benutzen.
Da ich denke das sauberste wäre das zweite habe ich das geschrieben:
import serial
from serial.tools.hexlify_codec import hex_decode
# stty -F /dev/ttyAMA0 19200 cs8 parenb -parodd -icrnl -opost -isig -icanon -echo
DEVICE = '/dev/ttyAMA0'
BAUDRATE = 19200
while True:
with serial.Serial(DEVICE, BAUDRATE, serial.EIGHTBITS, serial.PARITY_EVEN) as connection:
byte = connection.read()
print(hex_decode(byte))
Alles anzeigen
Das gibt mir das zurück:
pi@raspberrypi:~ $ sudo python3 read.py
('68 ', 1)
('E0 ', 1)
('E6 ', 1)
('68 ', 1)
('80 ', 1)
('E6 ', 1)
('68 ', 1)
('A0 ', 1)
('E6 ', 1)
('68 ', 1)
('00 ', 1)
('E6 ', 1)
Alles anzeigen
aber ich erwarte was socat mich liefert:
pi@raspberrypi:~ $ sudo socat -x -u /dev/ttyAMA0,raw,echo=0,crnl PTY,link=/dev/ttyV1,raw,echo=0,crnl
> 2021/04/20 19:26:07.757024 length=8 from=0 to=7
68 0c 0c 68 f3 29 00 bc
> 2021/04/20 19:26:07.761566 length=8 from=8 to=15
e0 11 04 08 01 01 00 81
> 2021/04/20 19:26:07.764381 length=2 from=16 to=17
58 16
> 2021/04/20 19:26:07.819947 length=8 from=18 to=25
68 0c 0c 68 f3 29 00 bc
> 2021/04/20 19:26:07.824556 length=8 from=26 to=33
e0 11 04 08 01 01 00 81
> 2021/04/20 19:26:07.827379 length=2 from=34 to=35
58 16
> 2021/04/20 19:26:07.882922 length=8 from=36 to=43
68 0c 0c 68 f3 29 00 bc
> 2021/04/20 19:26:07.887559 length=8 from=44 to=51
e0 11 04 08 01 01 00 81
> 2021/04/20 19:26:07.890379 length=2 from=52 to=53
58 16
> 2021/04/20 19:26:07.945934 length=8 from=54 to=61
68 0c 0c 68 f3 29 00 bc
> 2021/04/20 19:26:07.950551 length=8 from=62 to=69
e0 11 04 08 01 01 00 81
> 2021/04/20 19:26:07.953382 length=2 from=70 to=71
58 16
Alles anzeigen
Und damit meine ich die raw werte bzw. Hex bytes (Zeitstempel usw. spielen nun keine Rolle).
Ich erwarte ein Dataframe, die 0x68 als startbyte hat und 0x16 als stopbyte (wie bei socat output).
Pyserial liest das erste Byte richtig (0x68) aber danach stimmt das Frame nicht mehr (0x0C 0x0C 0x68 ..... 0x16 sollte folgen).
Kann mir jemand helfen?
Sollte ich in die Argumente von Serial() noch was schreiben, damit analog zu meine tty Einstellungen ist?
Vielen Dank in voraus.
LG,
Simón
P.S. Dass, das pyserial output 1 byte pro linie ausgibt und socat Zeilenweise, spielt erstmal keine Rolle.