Hallo,
ich beschäftige mich grade mit meinem Raspberry Pi, indem ich mit der
App fürs Smartphone NetIO versuche eine LED an meinen Raspberry
anzusteuern.
das klappt auch soweit alles seht gut.
Jetzt möchte ich gernen im nächsten schritt die per App gesendeten Daten
über UART versenden.
Doch bevor ich dieses in Angriff nehme, sitz ich jetzt schon ewig dabei,
zu versuchen, wie man es in Python hinbekommt, dass die IP Verbindung
zur App nicht jedesmal wieder neu aufgesetzt werden muss, indem man das
Programm neu startet.
Irgendwie muss die Verbindung bei jedem Verbindungsabbruch zurückgesetzt
werden.
Hat da jemand von euch schon mal was gemacht ?
Hier hab ich mal den Code von http://netio.davideickhoff.de/
reingepackt:
Hallo Thorsten,
das Problem ist hier, dass Dein Progrämmchen so geschrieben ist, dass es
nur eine Verbindung annimmt:
Zu Beginn
1
s.bind((HOST, PORT))
2
s.listen(1)
3
conn, addr = s.accept()
d.h. Du hängst Dich an den TCP/IP Port (bind), wartest auf eine
Verbindung (listen) und nimmst Sie an (accept).
Dann gehst Du in die Endlosschleife (while (1)) um die Daten zu
verarbeiten.
Wenn nichts mehr kommt hast Du ein Problem:
das Programm hängt in der Endlosschleife, aber es existiert keine
Verbindung mehr.
D.h. Du müsstest das Annehmen der Verbindung in die Schleife
hineinnehmen und richtig auf Verbindungsabbruch/-Ende mit der Gegenseite
reagieren (vermutlich close, evtl. nochmal listen).
D.h. Deine Schleife sähe schnell hingeschrieben in etwa so aus:
1
bind
2
listen
3
modus = warten auf verbindung
4
while (1)
5
prüfen auf eingehende verbindung
6
wenn eingehende verbindung
7
accept
8
modus = daten empfangen
9
wenn modus == daten empfangen
10
daten vorhanden?
11
ja: daten empfangen, daten verarbeiten
12
nein: nach x Zeit keine Daten: aktiv Verbindung trennen,
13
ggf verbindungsannahme neu initialisieren
14
modus = warten auf Verbindung
15
verbindungsabbruch von gegenseite:
16
close
17
evtl. verbindungsannahme neu initialisieren
18
modus = warten auf Verbindung
Evtl. muss man noch abfangen, dass man nicht mehr als 1 Verbindung
annimmt - sonst wird's etwas komplizierter, wenn man mehrere
Verbindungen verwalten will.
Vg,
Conny
Dafür müssten sich übrigens Code-Beispiele finden lassen, wie man die
Connections beendet und wieder annimmt - jeder selbstgebaute Python
Simple/Mini-Webserver macht das.
Vielen dank für die vielen und vor allem super Antworten.
Das mit den mehreren Verbindungen klappt super und ich kann mich mit
mehreren Clienten anmelden.
Jetzt kommt mein nächstes Problem. ich habe einen Beispielcode für UART
aus dem Netz gezogen, um einmal die Verbindung über UART zu testen.
Dazu habe ich einen Pegelwandler zwischen Raspberry und Pc geklemmt. Die
Verbindung funktioniert auch prima und ich kann daten zum Pc schicken.
Soabl ich aber versuche daten vom Pc zu empfangen, schmiert das Programm
auf dem Pi immer ab.
In den Anhang habe ich mal einen Sreenshot gepackt, auf dem man in SSH
die konsole und dann HTerm auf dem Pc sehen kann, welche Fehlermeldung
kommt.
Woran liegt das, also das Programm wurde im Netz als funktionsfähig
beschrieben.
1
# Serial Interface Raspberry Pi <----> ATXMEGA
2
3
importserial
4
importtime
5
importplatform
6
importdecimal
7
importbinascii
8
9
10
11
12
print"......Start Program....."
13
print"OS Name = ",platform.system()
14
print"Time/Date = ",time.asctime()
15
16
17
# Some String conversions as Python lessons
18
# Convert decimal to string
19
dec=decimal.Decimal("12")
20
dec=dec*3
21
printstr(dec)
22
23
24
# convert hex to ASCII string --> &H41 --> "A" ....
25
my_string="41424344454647"
26
printbinascii.unhexlify(my_string)
27
28
29
# or
30
31
32
printmy_string.decode("hex")
33
34
35
# Using a bytearray
36
bytes=bytearray(b"ABDCEFGHIJKLMNOPQRSTV")
37
# 65 decimal = "A" ASCII
38
printbytes[0]
39
printbytes[1]
40
41
42
43
# configure the serial port of raspberry pi (ttyAMA0)
44
# Make sure this port will not be used by the system like Syslog....
Hallo Thorsten,
also die Fehlermeldung und Fehlererscheinung sagt mir gerade nichts.
Der Code sieht bei einem schnellen Überflug auch ok aus.
Eins was mir mal Ärger gemacht hat:
beim Raspberry Pi hängt standardmässig die Console am seriellen Port,
hast Du den auch abgehängt?
Das geht so:
- in /etc/inittab die Zeile "T0:23:respawn:/sbin/getty -L ttyAMA0 115200
vt100" auskommentieren
- in /boot/cmdline.txt den Teil "console=ttyAMA0,115200" entfernen
Vg,
Conny
Hallo Conny,
genau daran hat es gelegen......... Man und das hat mich etliche Stunden
gekostet. Wo kann man sowas denn nachlesen, weil ich hab sowas nirgendwo
gefunden.
Kann mir noch jemand sagen, ob es für die UART Schnittstelle auch sowas
wie eine UART Variable gibt, nach welcher man abfragen kann, ob
überhaupt igendetwas gesendet worden ist, damit man nicht immer auf eine
Nachricht warten muss. Sowas wie:
if (UART hat Daten empfangen = 1)
Daten auswerten
print (Daten)
else
normaler Programmablauf
Ich versuch mich da immer an der C-Programmierung zu orientieren, da
gibt es sowas ja.....
MfG
Hi Thorsten,
serielle Console abschalten: das hab ich auch mal irgendwo gelesen, als
ich schon einiges an seltsamen Effekten damit hatte :-)
Hier hab ich's grad wiedergefunden:
http://www.hobbytronics.co.uk/raspberry-pi-serial-port
Du meinst einen "non-blocking call" für's Zeichen lesen von Uart in
Python?
Das gibt's. Du kannst entweder das zeilenweise Lesen in einen eigenen
Thread verlagern:
http://stackoverflow.com/questions/17553543/pyserial-non-blocking-read-loop
oder Du liest einzelne Zeichen und wertest aus, ob Du überhaupt etwas
bekommen hast:
1
ser = serial.Serial( '/dev/ttyAMA0', 38400, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=0, xonxoff$
Hallo, wie programmiere ich das ich die GPIO Pins beim Raspberry PI so
dass ich sie über Bluetooth ansteuern kann also dann zb. über eine App.
Hat jemand ne IDEE??