Seite 1 von 1
ASCII
Verfasst: Samstag 8. August 2015, 11:30
von semper27
Hallo,
ich möchte mit Python ein Gerät vom PC aus steuern. Eigentlich sollte es so funktionieren: Der PC sendet den ASCII Code "ENQ" und das Gerät gibt dann "ACK" (bereit) oder "NAK" (nicht bereit) zurück.
Das habe ich bisher probiert:
Code: Alles auswählen
import serial
import time
ser = serial.Serial(port='COM4', timeout=10)
ser.write('\x05') #ENQ hexadezimal
time.sleep(4)
rueckgabe = ser.readline()
print rueckgabe
als Rückgabe kommt jetzt manchmal ein Minus Zeichen, manchmal ein Pfeil und ein Minus. Wie kann ich das in ASCII Code darstellen?
Das Minus heißt wohl "ACK". ord(rueckgabe) gibt dann 6, und "ACK" ist das sechste Zeichen in ASCII. Aber bei "Pfeil Minus" funktionert es so nicht, es kommt folgende Fehlermeldung:
ord() expected a character, but string of length 2 found
Re: ASCII
Verfasst: Samstag 8. August 2015, 13:45
von Sirius3
@semper27: da kommen halt noch andere Steuerzeichen über die Leitung, z.B. ein SYN. Und unter welchem Zeichensatz ist ACK ein '-'?
Re: ASCII und Serial
Verfasst: Sonntag 9. August 2015, 14:15
von semper27

Das Zeichen ist kein Minus sondern ein nach oben verschobener langer Strich. Mit rueckgabe[0] habe die Zeichen einzeln ausgewählt, es war erst ESC dann ACK. Nun habe ich aber ein schwieriges Problem:
Bei einem Befehl ohne Parameter funktioniert die Kommunikation, bei einem mit Parameter nicht :K . Vewende ich vielleicht Serial nicht richtig oder habt ihr irgendeine Idee was man sonst noch ausprobieren könnte?
Der Code:
Code: Alles auswählen
import serial
import time
ser = serial.Serial(port='COM4', timeout=100)
for n in range(4):
try:
ser.write('\x05') #startet Kommunikation
time.sleep(4)
rueckgabe = ser.readline()
print rueckgabe[0]
print ord(rueckgabe[0])
if ord(rueckgabe[0]) == 6: break # 6 entspricht ACK
if n == 4: raise
except:
print "Fehler"
ser.close()
for n in range(4):
try:
ser.write('\x78\x00') #kalibriert das Gerät
time.sleep(4)
rueckgabe = ser.readline()
print rueckgabe[0]
print ord(rueckgabe[0])
if ord(rueckgabe[0]) == 6: break # 6 entspricht ACK
if n == 4:
for n in range(4):
ser.write('\x05')
time.sleep(4)
rueckgabe = ser.readline()
print rueckgabe[0]
print ord(rueckgabe[0])
if ord(rueckgabe) == 6: break
if n == 4: raise
for n in range(4):
ser.write('\x78\x00')
time.sleep(4)
rueckgabe = ser.readline()
print rueckgabe[0]
print ord(rueckgabe[0])
if ord(rueckgabe) == 6: break
if n == 4: raise
except:
print "Fehler"
ser.close()
for n in range(3):
try:
time.sleep(4)
rueckgabe = ser.read(1)
print rueckgabe
print ord(rueckgabe)
if ord(rueckgabe[0]) == 4: #Ende der Kommunikation
ser.write('\x06')
break
if n == 4: raise
except:
print "Fehler"
ser.close()
ser.close()
#Sorry für die umständlichen Wiederholungen und die unfertige Fehlerabfrage, wollte nur testen ob es überhaupt geht...
Wenn ich mit ser.write('\x76\x32\x00') statt ser.write('\x78\x00')einen Befehl mit Parameter benutze funktionert es nicht mehr
Re: ASCII
Verfasst: Sonntag 9. August 2015, 15:35
von semper27
Noch ein vielleicht wichtiger Hinweis: Wenn man timeout auf None setzt und read(100) verwendet, wird nicht ewig gewartet bis 200 Bytes angekomen sind, sondern es kommt sofort der Fehler: print ord(rueckgabe[0])
IndexError: string index out of range