Vraag


  • Toppertje
  • Registratie: December 2009
  • Laatst online: 14:19

Toppertje

www.davideografie.nl

Topicstarter
Momenteel ben ik bezig om (als beginner) een Raspberri Pi 3 (incl. 8kanaal relais bord) via bluetooth te verbinden met mijn telefoon zodat er een relais geschakeld kunnen gaan worden. Echter loop ik vast, de bluetooth verbinding komt tot stand, alleen de code herkent de tekst niet zodat er daadwerkelijk iets gebeurt:

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from bluetooth import * 
 
server_sock=BluetoothSocket( RFCOMM )
 
port = 1
server_sock.bind(("",port))
server_sock.listen(1)
 
client_sock,address = server_sock.accept()
print ("Je hebt connectie gemaakt met: ",address)
while True:
    
    data = client_sock.recv(1024)
    print ("Ontvangen:[%s]"%data)
    if (data == "e"):
        print ("sluiten")
        break
        
client_sock.close()
server_sock.close()


Het resultaat:
Python:
1
2
3
4
Je hebt connectie gemaakt met:  ('C0:EE:FB:D5:70:BF', 1)
Ontvangen:[b'1']
Ontvangen:[b'0']
Ontvangen:[b'e']


Hierna gebeurt er dus niks meer, terwijl het de bedoeling is dat het programma stopt als er een "e" binnenkomt. Heeft iemand een idee wat er mis gaat? Alvast bedankt!

De meeste info komt van deze tutorial .

Beste antwoord (via Toppertje op 01-12-2017 22:09)


  • TommieW
  • Registratie: December 2010
  • Laatst online: 14:35

TommieW

Numa numa.

Ik had een heel verhaal klaar, maar @tagican was me voor. :+

Even een aanvulling, zelf zou ik de bytestring decoden naar een gewone Python string. Hier een kleine demo:
>>> x = b'e'
>>> if x == "e": print("Ja")
>>> if x.decode('UTF-8') == "e": print("Ja")
Ja

1700X@3,9GHZ - Asus Crosshair VI Hero - 32GB Corsair LPX - GTX 1070Ti
iPhone 13 Pro Max - Macbook Pro 16" M1 Pro

Alle reacties


Acties:
  • +1 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 14:42

The Eagle

I wear my sunglasses at night

Nou ben ik niet heel bekend met dit spul, maar volgens mij wil je je boolenan false maken. Met die break ga je de if loop uit maar niet de while, althans, zoals ik het lees.
De while True lijkt mij nu op de connectie te slaan. Die blijft wel open zo ;)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Acties:
  • 0 Henk 'm!

  • SA007
  • Registratie: Oktober 2002
  • Laatst online: 13:09

SA007

Moderator Tweaking
Nee, de break die klopt, een if kan je niet met break afbreken, je hebt dan de eerste for/while loop die je afbreekt.

Ik weet niet exact hoe het in python zit, maar in veel talen is "" anders dan '',
"" is een string, en '' een character.
Ik zou een proberen met if (data == 'e')


Edit:
Het valt me net op dat je data meer is dan alleen het karakter.
Bij je print zet je de ontvangen data direct tussen [], maar in de uitvoer van je programma staat hier 'b'e'.
Dus wellicht staat er meer in je data dan verwacht.

[ Voor 30% gewijzigd door SA007 op 01-12-2017 09:25 ]


Acties:
  • 0 Henk 'm!

  • Toppertje
  • Registratie: December 2009
  • Laatst online: 14:19

Toppertje

www.davideografie.nl

Topicstarter
SA007 schreef op vrijdag 1 december 2017 @ 09:23:
Nee, de break die klopt, een if kan je niet met break afbreken, je hebt dan de eerste for/while loop die je afbreekt.

Ik weet niet exact hoe het in python zit, maar in veel talen is "" anders dan '',
"" is een string, en '' een character.
Ik zou een proberen met if (data == 'e')


Edit:
Het valt me net op dat je data meer is dan alleen het karakter.
Bij je print zet je de ontvangen data direct tussen [], maar in de uitvoer van je programma staat hier 'b'e'.
Dus wellicht staat er meer in je data dan verwacht.
Dat viel mij ook op inderdaad, echter verstuur ik met de Blueterm 2 app vanaf de telefoon echt enkele tekens, ik zou niet weten hoe ik daarmee meerdere tekens verstuur. Als ik wel meerdere tekens zou kunnen versturen zou, in dit geval de b, niet buiten de aanhalingstekens komen te staan lijkt mij.

Acties:
  • 0 Henk 'm!

  • tagican
  • Registratie: December 2012
  • Laatst online: 13:26
Het is een gokje, maar je vergelijkt een bytestring met een string, waardoor je niet dezelfde waarde krijgt. Ik zocht heel even en vond dit wel een aardige uitleg: https://stackoverflow.com...prefix-to-python-variable

Voor jou geldt, dat je eens moet proberen om de code in de if-statement als volgt moet maken:
code:
1
if (data == bytes("e")):


Edit: Of natuurlijk de verkregen bytestring aanpassen naar een string ;)

[ Voor 9% gewijzigd door tagican op 01-12-2017 19:47 ]


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • TommieW
  • Registratie: December 2010
  • Laatst online: 14:35

TommieW

Numa numa.

Ik had een heel verhaal klaar, maar @tagican was me voor. :+

Even een aanvulling, zelf zou ik de bytestring decoden naar een gewone Python string. Hier een kleine demo:
>>> x = b'e'
>>> if x == "e": print("Ja")
>>> if x.decode('UTF-8') == "e": print("Ja")
Ja

1700X@3,9GHZ - Asus Crosshair VI Hero - 32GB Corsair LPX - GTX 1070Ti
iPhone 13 Pro Max - Macbook Pro 16" M1 Pro


Acties:
  • 0 Henk 'm!

  • Toppertje
  • Registratie: December 2009
  • Laatst online: 14:19

Toppertje

www.davideografie.nl

Topicstarter
TommieW schreef op vrijdag 1 december 2017 @ 19:55:
Ik had een heel verhaal klaar, maar @tagican was me voor. :+

Even een aanvulling, zelf zou ik de bytestring decoden naar een gewone Python string. Hier een kleine demo:
>>> x = b'e'
>>> if x == "e": print("Ja")
>>> if x.decode('UTF-8') == "e": print("Ja")
Ja
Thanks! Dat werkt. Die b staat er nog wel bij, maar dat doet niks af aan de werking d:)b

Python:
1
2
3
4
5
Je hebt connectie gemaakt met:  ('C0:EE:FB:D5:70:BF', 1)
Ontvangen:[b'w']
Ontvangen:[b'q']
Ontvangen:[b'e']
sluiten
Pagina: 1