-
Notifications
You must be signed in to change notification settings - Fork 5
/
serlog.py
118 lines (101 loc) · 4.49 KB
/
serlog.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
'''
Copyright 2024 philippoo66
Licensed under the GNU GENERAL PUBLIC LICENSE, Version 3 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.gnu.org/licenses/gpl-3.0.html
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
'''
import serial
import time
from datetime import datetime
# VS detection +++++++++++++++++++++++
ring_buffer = bytearray([0xFF, 0xFF, 0xFF])
# Funktion zum Hinzufügen von Bytes zum Puffer
def add_to_buffer(new_bytes):
global ring_buffer
for byte in new_bytes:
ring_buffer.pop(0) # Entferne das erste Byte (das älteste Byte)
ring_buffer.append(byte) # Füge das neue Byte am Ende hinzu
# utils ++++++++++++++++++++
def bbbstr(data_buffer):
return ' '.join([format(byte, '02X') for byte in data_buffer])
# main ++++++++++++++++++++++++++++++++
def main():
# Konfiguration der seriellen Schnittstellen
# Vitoconnect (älter: /dev/ttyAMA0)
#ser1 = serial.Serial('/dev/ttyS0', baudrate=4800, bytesize=8, parity='E', stopbits=2, timeout=0) # '/dev/ttyS0'
ser1 = serial.Serial('/dev/ttyS0',
baudrate=4800,
parity=serial.PARITY_EVEN,
stopbits=serial.STOPBITS_TWO,
bytesize=serial.EIGHTBITS,
timeout=0,
exclusive=True)
# Optolink Kopf
#ser2 = serial.Serial('/dev/ttyUSB0', baudrate=4800, bytesize=8, parity='E', stopbits=2, timeout=0) # '/dev/ttyUSB0'
ser2 = serial.Serial('/dev/ttyUSB0',
baudrate=4800,
parity=serial.PARITY_EVEN,
stopbits=serial.STOPBITS_TWO,
bytesize=serial.EIGHTBITS,
timeout=0,
exclusive=True)
#
# VS2 detection
global ring_buffer
vs2detectd = False
now = datetime.now()
ts = now.strftime("%y%m%d%H%M%S")
logf = 'serlog_' + ts + '.txt'
# Öffnen der Ausgabedatei im Schreibmodus
with open(logf, 'a') as f:
try:
while True:
# Lesen von Daten von beiden seriellen Schnittstellen
data1 = ser1.read()
data2 = ser2.read()
fdata = False
# Überprüfen, ob Daten von ser1 empfangen wurden und dann auf ser2 schreiben
if data1:
ser2.write(data1)
fdata = True
if not vs2detectd:
add_to_buffer(data1)
# Überprüfen, ob Daten von ser2 empfangen wurden und dann auf ser1 schreiben
if data2:
ser1.write(data2)
fdata = True
if not vs2detectd:
#print(bbbstr(ring_buffer))
if ring_buffer == bytearray([0x16, 0x00, 0x00]):
print("buffer ok")
if(data2 == b'\x06'):
vs2detectd = True
msg = "VS2 Initialisierung erkannt."
print(msg)
f.write(msg+"\n")
if fdata:
# Zeitstempel in Millisekunden erzeugen
timestamp_ms = int(time.time() * 1000)
# Daten in hexadezimaler Form mit Zeitstempel und Tab getrennt in die Datei schreiben
f.write(f"{timestamp_ms}\t{data1.hex().upper()}\t{data2.hex().upper()}\n") #\t{bbbstr(ring_buffer)}\n")
#f.flush() # Puffer leeren, um sicherzustellen, dass die Daten sofort in die Datei geschrieben werden
# Wartezeit für die Schleife, um die CPU-Last zu reduzieren
time.sleep(0.001) # Anpassen der Wartezeit je nach Anforderung
except KeyboardInterrupt:
print("Abbruch durch Benutzer.")
finally:
# Schließen der seriellen Schnittstellen und der Ausgabedatei
ser1.close()
ser2.close()
#ser1.__del__() # hilft nix, macht man auch nicht
#ser2.__del__()
ser1 = None
ser2 = None
if __name__ == "__main__":
main()