Forum: PC-Programmierung Sock hängt sich auf Python


von Crazy-Sonic (Gast)


Lesenswert?

Hallo liebes Forum,

Ich bastele grade an einem "Gateway" für Sensordaten auf einem Raspberry 
Pi, mein Code läuft auch bis auf dem Socket.
Allerding finde ich den fehler nicht. Vieleicht kann mir jemand helfen, 
ich bin noch neu in Python vieleicht kann mir ja
auch jemand noch Tips geben zu Optimirung. :idea:

Hardware:
Raspberry Pi 1
Geigerzähler an ttyAMA0 der jede Sekunde den Aktuellen Wert schickt.( 
Optional USB tauglich, war mir aber zu kompliziert :oops: )
SPS über Ethernet angekoppelt.

Software:
Das Script soll die Daten von der Seriellen Schnittstelle auf dem 
Ethernet an Port 10001 bereitstellen.
Es sollen noch weitere Sensoren folgen ( Temperatur, Luftfeuchte, usw ).

Hier der Code:
1
#! /usr/bin/python3
2
import sys, tkinter, serial, time, _thread, socket, platform
3
4
#Sytem Variables
5
global hostname
6
global tcp_port
7
global tcp_ip
8
global ser
9
global act_rad
10
global buffer_size
11
12
tcp_ip = "192.168.2.50"
13
tcp_port = 10001
14
buffer_size = 1024
15
16
#Serielle Schnittstelle Öffnen und das empfangene in eine Varriable Schreiben
17
def openser():
18
    ser = serial.Serial()
19
    ser.port = "COM1"
20
    ser.baudrate = 9600
21
22
    ser.open()
23
    if ser.isOpen():
24
        print ("Serial Port Open!!")
25
        while ser.isOpen:
26
             act_rad = float(ser.readline())/100
27
    else:
28
        print ("Error!!")
29
30
31
#Socket Öffnen und auf Port 10001 Lauschen bis das Sendecommand von SPS kommt ("send_A1")
32
def opentcp():
33
    try:
34
        while 1:
35
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
36
            s.bind((tcp_ip, tcp_port))
37
            s.listen(1)
38
            conn, addr = s.accept()
39
            print ('Connection address:', addr)
40
            while 1:
41
                 data = conn.recv(buffer_size)
42
                 if not data: break
43
44
                 else:
45
                     print (data)
46
                     if data == b'send_A1' or data == b'send_A1\r\n':
47
                        conn.send(bytes("A1=" + str(act_rad) + ",\r\n", 'utf-8'))
48
49
        conn.close()
50
    except:
51
        print ("Verbindung vom Remote Beendet") #Wenn Sock beendet wird, neu Starten.
52
        tcpdata_threadID = _thread.start_new_thread(opentcp, ())
53
54
55
tcpdata_threadID = _thread.start_new_thread(opentcp, ())
56
openser()


Es wäre schön wenn mir jemand Helfen könnte,

mit Freundlichen Grüßen
Crazy

von Rolf M. (rmagnus)


Lesenswert?

Crazy-Sonic schrieb:
> Es wäre schön wenn mir jemand Helfen könnte,

Wobei? Was ist die Frage?

von Crazy-Sonic (Gast)


Lesenswert?

Das Script springt nach dem er den Befehl "send_A1" empfangen hat, in 
die except ausnahme...
1
     else
2
        print (data)
3
        if data == b'send_A1' or data == b'send_A1\r\n':       <-- von hier
4
            conn.send(bytes("A1=" + str(act_rad) + ",\r\n", 'utf-8'))
5
6
        conn.close()
7
8
    except:                          <-- nach hier
9
        print ("Verbindung vom Remote Beendet") #Wenn Sock beendet wird, neu Starten.
10
        tcpdata_threadID = _thread.start_new_thread(opentcp, ())

von Tom (Gast)


Lesenswert?

Die Exception nicht pauschal zu verschlucken, sondern auszugeben wäre 
hilfreich.

von Sascha W. (sascha-w)


Lesenswert?

des weiteren ist es auch nicht sinnvoll aus dem noch laufenden Thread 
einen neuen zu starten, immerhin könnte das Socket noch offen sein, so 
das ein erneutes Bind/Listen auf dem selben Port sowiso fehlschlägt.

Sascha

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.