Ankommende Nachricht ist nicht lesbar

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
sg_pyth
User
Beiträge: 10
Registriert: Montag 28. Mai 2007, 11:54

Hallo Leute,

ich möchte mit Hilfe einer TCP/IP Verbindung Daten von einer SPS (Speicherprogrammierbare Steuerung) zum PC schicken. Die Daten werden von der SPS zyklisch geschickt und dann mit Hilfe des unten stehenden Codes auf dem PC gespeichert. Es handelt sich dabei um etwas abgeänderte Variante des TCP Servers aus der Dokumentation. Die SPS sendet einen String "Hallo" an den PC. Die ankommende Nachricht hat folgende Gestalt "þ" und ist somit nicht lesbar.

Falls jemand die Ursache dafür kennt, wäre ich für Eure Hilfe sehr dankbar.

Code: Alles auswählen

#! /usr/bin/env python
# -*- encoding: latin1 -*-

# Dieser TCP-Server sendet alle Daten, die er empfängt an den
# Client als Antwort zurück

from socket import *


# Der standard Echo Port ist nicht sehr nützlich, da er root
# Rechte erfordert. Wir nehemen den Port 50007
ECHO_PORT = 2000
BUFSIZE = 1024
def main():
# TCP-Socket erstellen und an Port binden
    s = socket(AF_INET, SOCK_STREAM)
    f = file('C:\\gedicht.txt', 'a')
    print "Socket initiert"
    x = gethostname()
    print x
    y = gethostbyname(x)
    print y
    s.bind(('', ECHO_PORT))
    s.listen(1)
    print "Server gestartet"
    # Warte auf eine Verbindung zum Server
    conn, (remotehost, remoteport) = s.accept()
    print 'Verbunden mit %s:%s' % (remotehost, remoteport)

    while 1:
        # Empfange daten vom Client
        data = conn.recv(BUFSIZE)
        print "Echo:" + data
        f.write(data)
        f.write('\n')
        if not data:
                # Die Verbindung wurde getrennt
                # Abbruch
                break

    # Sende die Daten zurück zum client
    #conn.send(data)
    # Socket schließen
    s.close()
    f.close()
    print('Verbindung beendet')
if __name__ == '__main__':
    main()


Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

sg_pyth hat geschrieben:Die SPS sendet einen String "Hallo" an den PC. Die ankommende Nachricht hat folgende Gestalt "þ" und ist somit nicht lesbar.
Hallo sg_pyth!

Sagen wir es mal so: Ich kennen dein SPS-System nicht, aber ich glaube dir nicht, dass dir deine SPS ein "Hallo" schickt. "Hallo" ist deutsch und nicht englisch. Es ist eher der Fall, dass dir deine SPS ein Zeichen mit der Bedeutung "Hallo" schickt. Z.B. dieses "þ".

Wenn du selbst das "Hallo" geschickt hast, dann ist das natürlich etwas Anderes.

Gibt es in der Beschreibung deiner SPS keine Übersetzungstabelle?

mfg
Gerold
:-)

PS: Dein Serverprogramm funktioniert, wie man leicht mit HyperTerminal feststellen kann.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Wenn das Gerät keinen Text sondern "beliebige" Bytes schickt, dann solltest Du auch besser die Antwort als Darstellung von `repr()` ausgeben lassen. Sonst hängt es von der Kodierung im anzeigenden Programm ab, wie die Bytes dargestellt werden und was das 'þ' mal für einen Bytewert hatte.
sg_pyth
User
Beiträge: 10
Registriert: Montag 28. Mai 2007, 11:54

Hallo Gerold,

ich habe meine SPS so programmiert, dass ein String mit dem Inhalt "Hallo" verschickt wird. Den Inhalt habe ich selbst eingegeben.

Folgende Frage interessiert mich noch:
Die Methode recv liefert ja einen String zurück. Besteht vielleicht die Möglichkeit Daten bitweise auszulesen.
sg_pyth
User
Beiträge: 10
Registriert: Montag 28. Mai 2007, 11:54

Hallo BlackJack,

die Methode repr() hat mich schon etwas weiter gebracht. Jetzt kommt anstatt von unlesbaren Zeichen folgender String '\xfe\x05'. Diese Zeichenfolge soll das Wort "Hallo" sein.
BlackJack

Ändert sich etwas wenn Du die gesendete Zeichenkette änderst? Zum Beispiel in der Länge variierst? Die Vermutung die ich da habe ist, dass 0xFE so etwas wie ein Signalbyte sein könnte und die 0x05 die Länge von dem 'Hallo'. Bei einer Längenänderung würde sich also das zweite Byte ändern müssen wenn die Vermutung stimmt.
sg_pyth
User
Beiträge: 10
Registriert: Montag 28. Mai 2007, 11:54

Hallo Leute,

ich möchte damit die richtige Antwort bekanntgeben.
Bei '\x' handelt es sich um ein Maskierungszeichen. Nach diesem Zeichen wird der Wert eines Bytes in der hexadezimalen Darstellung angezeigt.

Grüsse,
sg.
BlackJack

Das ist die Erklärung wofür? Ich sehe da immer noch kein 'hallo'.
Antworten