Man benutzt keine *-Importe, sondern importiert die Namen, die man braucht (sleep) explizit. literal_eval wird importiert, aber gar nicht verwendet.
Man benutzt keine durchnummerierten Namen und kopiert auch nicht gleichlautenden Code 19 mal.
Code: Alles auswählen
import serial
from time import sleep
DATEN = {
1: b'68 06 06 68 81 80 4C 0D 00 01 5B 16',
2: b'68 06 06 68 81 80 4C 0D 00 02 5C 16',
3: b'68 06 06 68 81 80 4C 0D 00 03 5D 16',
4: b'68 06 06 68 81 80 4C 0D 00 04 5E 16',
5: b'68 06 06 68 81 80 4C 0D 00 05 5F 16',
6: b'68 06 06 68 81 80 4C 0D 00 06 60 16',
7: b'68 06 06 68 81 80 4C 0D 00 07 61 16',
8: b'68 06 06 68 81 80 4C 0D 00 08 62 16',
129: b'68 06 06 68 81 80 4C 0D 00 81 DB 16',
130: b'68 06 06 68 81 80 4C 0D 00 82 DC 16',
132: b'68 06 06 68 81 80 4C 0D 00 84 DE 16',
133: b'68 06 06 68 81 80 4C 0D 00 85 DF 16',
135: b'68 06 06 68 81 80 4C 0D 00 87 E1 16',
136: b'68 06 06 68 81 80 4C 0D 00 88 E2 16',
138: b'68 06 06 68 81 80 4C 0D 00 8A E4 16',
139: b'68 06 06 68 81 80 4C 0D 00 8B E5 16',
141: b'68 06 06 68 81 80 4C 0D 00 8D E5 16',
142: b'68 06 06 68 81 80 4C 0D 00 8E E8 16',
144: b'68 06 06 68 81 80 4C 0D 00 90 EA 16',
}
def senden_daten():
connection = serial.Serial(
port = "COM3",
baudrate = 19200,
parity = serial.PARITY_EVEN,
stopbits = serial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS,
#timeout = 1,
)
print("Serial Port ist offen!")
while True:
print("Neu lesen: \n")
results = {}
for channel, data in DATEN.items()
connection.write(data)
print(f"Kanal: {channel}")
print(f"Sende Daten: {data}")
results[channel] = connection.readline(35)
print(f"Empfangene Daten: {results[channel]}")
sleep(15)
if __name__ == "__main__":
senden_daten()
Die gesendeten Daten sehen so ähnlich aus, dass man die bestimmt aus der Kanalnummer berechnen kann.
Du benutzt readline. Also hast Du ein zeilenbasiertes Protokoll. Dann fehlt aber beim Senden das Newline-Zeichen.
Beim Lesen würde ich dann aber immer die komplette Zeile lesen und nicht nur 35 Zeichen davon.
Code: Alles auswählen
import serial
from time import sleep
CHANNELS = [1,2,3,4,5,6,7,8,129,130,32,133,135,136,138,139,141,142,144]
DATA = '68 06 06 68 81 80 4C 0D 00 {:02X} {:02X} 16\n'
def senden_daten():
connection = serial.Serial(
port = "COM3",
baudrate = 19200,
parity = serial.PARITY_EVEN,
stopbits = serial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS,
#timeout = 1,
)
print("Serial Port ist offen!")
while True:
print("Neu lesen: \n")
results = {}
for channel in CHANNELS
data = DATA.format(channel, channel + 90).encode('ASCII')
connection.write(data)
print(f"Kanal: {channel}")
print(f"Sende Daten: {data}")
results[channel] = connection.readline()
print(f"Empfangene Daten: {results[channel]}")
sleep(15)
if __name__ == "__main__":
senden_daten()
Und wie sehen nun die Empfangenen Daten exakt aus?