ID über serielle Schnittstelle einstellen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
therealseco
User
Beiträge: 9
Registriert: Donnerstag 30. Oktober 2014, 14:41

Hallo Leute!

Ich steh gerade vor einem neuem Problem, hab gegooglet und auch hier im Forum gesucht, aber leider nichts gefunden was mir weiter geholfen hat...

Ich habe bisher immer über HTerm die ID's eines Decoders geändert. Nun möchte ich das über Python vereinfachen. Im Endeffekt soll man einfach nur die Zahl eingeben und Python schreibt es selbst auf den Decoder.

PySerial hab ich schon installiert

Hab mir durch google bis jetzt das hier zusammengebastelt:

Code: Alles auswählen

import serial
ser = serial.Serial('COM4', 19200, timeout=1)
eingabe=input("Geben Sie bitte eine vierstellige ID ein\n")
ser.write('SETDECODERID=2323 "eingabe"')


Bekomme aber nur Fehlermeldungen.

serial.serialutil.SerialException: could not open port 'COM4': PermissionError(13, 'Zugriff verweigert', None, 5)

Ich muss zugeben ich hab solche Ports selber noch nie irgendwie programmiert, sondern immer über ein Programm, aber es wäre doch schön wenn man das so hinbekommen könnte. Bin offen für jede Kritik! Aus Fehlern lernt man schließlich am besten :mrgreen:

mfg
therealseco
User
Beiträge: 9
Registriert: Donnerstag 30. Oktober 2014, 14:41

Komischerweise akzeptiert er jetzt auf einmal den Port, bringt aber folgende Fehlermeldung:

TypeError: an integer is required

ist "eingabe" denn kein int? :K
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@therealseco: wo tritt denn der TypeError auf? Zeig doch auch diesen Code-Abschnitt. Je nach Python-Version ist `eingabe` kein int. Und in Zeile 4 ist eingabe garantiert kein int.
therealseco
User
Beiträge: 9
Registriert: Donnerstag 30. Oktober 2014, 14:41

Danke für die schnelle Antwort! Also ich habe Python 3.4.2 und wenn ich im Code auf eines von den "eingabe" gehe, werden beide gelb unterlegt, dachte dass zeigt dass es ein und das selbe ist.

Der ganze code geht so:

Code: Alles auswählen

import subprocess, time, serial
ser = serial.Serial('COM4', 19200, timeout=1)
time.sleep(1)
subprocess.Popen(r'C:\DecoderProgramming\avrdude.exe -p m2564rfr2 -c jtag2 -U efuse:w:0xfe:m -U hfuse:w:0x99:m -U lfuse:w:0xff:m -U flash:w:"\DecoderProgramming\ProgramBinaries\Decoder.hex" -U eeprom:w:"\DecoderProgramming\ProgramBinaries\Decoder.eep"')
time.sleep(15)
subprocess.Popen(r'C:\DecoderProgramming\icd3cmd.exe -E -M -F"\DecoderProgramming\ProgramBinaries\loop.production.hex" -P24EP128MC202')
time.sleep(25)
eingabe=input("Geben Sie bitte eine vierstellige ID ein\n")
ser.write('SETDECODERID=2323 eingabe')
(hatte die gänsefüßchen geändert bei der eingabe am Ende, hat aber nichts bewirkt)

und der Fehler der auftaucht:

Traceback (most recent call last):
File "C:\...\Decoder.py", line 14, in <module>
ser.write('SETDECODERID=2323 eingabe')
File "C:\Python34\lib\site-packages\serial\serialwin32.py", line 283, in write
data = to_bytes(data)
File "C:\Python34\lib\site-packages\serial\serialutil.py", line 76, in to_bytes
b.append(item) # this one handles int and str for our emulation and ints for Python 3.x
TypeError: an integer is required


mfg
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@therealseco: bei Python 3 ist `eingabe` ein String und keine Zahl. Auch wird eingabe nicht auf magische Weise im String 'SETDECODERID=2323 eingabe' durch den Wert der Variable `eingabe` ersetzt.
Zudem erwartet ser.write Bytes und keinen String, was durch die etwas seltsame Fehlermeldung nicht wirklich klar wird.
Schau Dir mal die Kapitel Stringformatierung und Encoding näher an.

PS: im anderen Thread wurde Dir schon gezeigt, wie die Popen-Aufrufe eigentlich aussehen sollten.
therealseco
User
Beiträge: 9
Registriert: Donnerstag 30. Oktober 2014, 14:41

Ok danke, wie gesagt, ich bin noch absoluter Neuling, die Idee dahinter ist eigentlich dass ich per Hand eine vierstellige ID eingebe und diese mit dem Befehl "setdecoderid=eingabe" an den Decoder sende und somit die ID setze.

Wie kann ich denn den Code so umschreiben, dass es ein int ist?

Im Code hat sich meinerseits ein Fehler eingeschlichen, da soll natürlich 'SETDECODERID=eingabe' stehen, die Zahl war noch von einem Experiment übrig...
therealseco
User
Beiträge: 9
Registriert: Donnerstag 30. Oktober 2014, 14:41

Sirius3 hat geschrieben:PS: im anderen Thread wurde Dir schon gezeigt, wie die Popen-Aufrufe eigentlich aussehen sollten.
hab ich geändert, danke
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@therealseco: Ein int bekommst Du durch explizite Typumwandlung:

Code: Alles auswählen

eingabe = int(input("Geben Sie bitte eine vierstellige ID ein\n"))
ser.write('SETDECODERID={}'.format(eingabe).encode('ascii'))
Was die zweite Zeile bedeutet, solltest Du Dir aber dringend klar machen, sonst stehst Du beim nächsten Aufruf von ser.write wieder vor vielen Fragezeichen.
Antworten