ASCII

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
semper27
User
Beiträge: 14
Registriert: Freitag 24. April 2015, 16:14

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
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@semper27: da kommen halt noch andere Steuerzeichen über die Leitung, z.B. ein SYN. Und unter welchem Zeichensatz ist ACK ein '-'?
semper27
User
Beiträge: 14
Registriert: Freitag 24. April 2015, 16:14

:oops: 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
semper27
User
Beiträge: 14
Registriert: Freitag 24. April 2015, 16:14

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
Antworten